У меня на сервере приложений есть очень простая java-программа (J.java, см. Ниже), которая успешно подключается к базе данных Oracle 11.2 на сервере базы данных (оба сервера - Linux CentOS) с использованием тонкого драйвера JDBC от Oracle.
Как видно из команды setURL в приведенном ниже коде Java, я настроил серверы приложений и базы данных так, чтобы они находились рядом друг с другом, и они находятся в одной сети (кросс-кабель соединен между собой) так что на этих (разрабатываемых) блоках нет сетевого трафика, кроме моего кода.
Проблема в том, что время выполнения сильно варьируется. Если я запускаю его 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
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;
}
}
}
ОБНОВЛЕНИЕ 1:
Это похоже на потенциального преступника:
http://www.usn -it.de / index.php / 2009/02/20 / оракул-11g-JDBC-драйвер-зависании-блокированного по-devrandom-энтропия бассейн пустой /
Кто-нибудь знает, как на самом деле реализовать предоставленное там решение (см. Пункт 3 в конце - где бы я мог найти это -Djava.security.egd=file:///dev/urandom
, чтобы изменить его?)