Oracle在Linux系统连接很慢的问题
无比的兴奋,新版本的Bing支持国际版,这样就可以更好的检索国外的资料了。Oracle在Centos7中连接局域网内的速度很慢的问题,终于找到问题的原因了,当然可能还会存在其他问题,本文考虑两个: ProxySelector.setDefault(null);
在开始连接数据库前调用,我开始的时候感觉有效,过一段时间就没有效果了,任然很慢,甚至第一次连接是失败的。 (2)安全随机数问题 long start = (Calendar.getInstance().getTimeInMillis());
System.out.println("Ok: " + SecureRandom.getInstance("SHA1PRNG").nextLong());
System.out.println(Calendar.getInstance().getTimeInMillis() - start);
Windows上执行,第一次在:60ms左右,后面该函数执行时间在1ms以内;而CentOS7 + OpenJDK 1.8,第一次在4800ms左右,后面函数执行时间在1ms以内。这个现象和连接Oracle第一次很慢很相似。 -Djava.security.egd=file:/dev/urandom
// 或(建议使用下面)
-Djava.security.egd=file:/dev/./urandom
通过增加该参数执行程序,发现,第一次执行时间在CentOS机器上只有39ms! import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.List;
public class OracleConnTest {
public static void main(String[] args){
try {
ProxySelector selector = ProxySelector.getDefault();
List<Proxy> lstProxies = selector.select(URI.create("socket://10.0.0.10:1521"));
if (lstProxies != null){
for (Proxy proxy : lstProxies){
System.out.println(proxy.address().toString() + "," + proxy.type());
}
}
ProxySelector.setDefault(null);
lstProxies = selector.select(URI.create("socket://10.0.0.10:1521"));
if (lstProxies != null){
for (Proxy proxy : lstProxies){
System.out.println(proxy.address().toString() + "," + proxy.type());
}
}
long start;
start = Calendar.getInstance().getTimeInMillis();
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
System.out.println("time elpase in get forname action:" + (Calendar.getInstance().getTimeInMillis() - start));
start = Calendar.getInstance().getTimeInMillis();
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.10:1521:irobot","robotservice","robotservice");
System.out.println("time elpase in get connection action:" + (Calendar.getInstance().getTimeInMillis() - start));
start = Calendar.getInstance().getTimeInMillis();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select 10 from dual");
System.out.println("time elpase in get data action:" + (Calendar.getInstance().getTimeInMillis() - start));
while(rs.next()){
System.out.print("must be 10:" + rs.getInt(1));
}
start = Calendar.getInstance().getTimeInMillis();
rs.close();
st.close();
conn.close();
System.out.println("time elpase in get close action:" + (Calendar.getInstance().getTimeInMillis() - start));
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行方法如下: java -cp .:./ojdbc6.jar OracleConnTest java -cp .:./ojdbc6.jar -Djava.security.egd=file:/dev/./urandom OracleConnTest (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |