我在我的应用服务器上有一个非常简单的java程序(J.java,见下文),该程序使用Oracle的JDBC瘦驱动程序成功连接到数据库服务器上的Oracle 11.2数据库(两个服务器都是Linux CentOS).
正如您在下面的Java代码中的setURL命令中所看到的,我已将应用程序和数据库服务器配置为彼此相邻,并且它们位于同一网络上(交叉电缆相互连接),因此,除了我的代码之外,这些(开发)框上没有网络流量.
问题是执行时间变化很大.如果我运行它5次,它(看似随机)可能需要0.01秒,或10秒,或50秒,或超过一分钟才能执行.如果超过一分钟(大致),程序无法完成,但会返回下面显示的错误.
有什么想法可以在这里发生什么?
--------error returned when execution take more than about 1 minute-------
gn@host7 [~/fd]# java -cp ./ojdbc6_g.jar:. J
Exception in thread "main" java.sql.SQLRecoverableException: IO Error: Connection reset
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:494)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:547)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:225)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:29)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:556)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:454)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:328)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:233)
at J.main(J.java: line 16)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at oracle.net.ns.DataPacket.send(DataPacket.java:219)
at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:208)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:224)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:172)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:97)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:82)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:120)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:76)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1158)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1134)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:307)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:199)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:365)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:812)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
... 8 more
Run Code Online (Sandbox Code Playgroud)
以下java代码:J.java是:
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
class J {
public static void main(String args[]) throws SQLException {
Connection conn;
// connect to database
OracleDataSource ds = new OracleDataSource();
ds.setURL("jdbc:oracle:thin:hr/hrpwd@192.168.0.1:1973:mySID");
conn = ds.getConnection();
// create Oracle DatabaseMetaData object
DatabaseMetaData meta = conn.getMetaData();
// show database version
System.out.println("Database version is " + meta.getDriverVersion());
if ( conn != null ) {
try { conn.close(); } catch ( Exception ex ) {}
conn = null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新1:
这看起来像潜在的罪魁祸首:
任何人都知道如何实际实现那里提供的解决方案(最后见第3项 - 我会在哪里找到它-Djava.security.egd=file:///dev/urandom来改变它?)
答案如下(来自CentOS论坛):
Try editing /etc/sysconfig/rngd to contain:
# Add extra options here
EXTRAOPTIONS="-r /dev/urandom"
Then "service rngd start". If that works, then "chkconfig rngd on" will start it at boot.
Run Code Online (Sandbox Code Playgroud)
也可以看看:
http://www.linuxfromscratch.org/hints/downloads/files/entropy.txt
https://www.centos.org/modules/newbb/viewtopic.php?topic_id=36209&start=0#forumpost156856
https://forums.oracle.com/forums/thread.jspa?messageID=3793101
| 归档时间: |
|
| 查看次数: |
11537 次 |
| 最近记录: |