Простая Java-программа, подключающаяся к серверу базы данных с помощью JDBC, имеет время выполнения везде разное

У меня есть очень простая программа 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.(PhysicalConnection.java:547)
at oracle.jdbc.driver.T4CConnection.(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/ 20/02/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

Кто-нибудь знает, как на самом деле реализовать представленное там решение (см. пункт 3 в конце - где бы я найдите этот -Djava.security.egd=file:///dev/urandom, чтобы изменить его?)

5
задан ggkmath 5 March 2012 в 20:53
поделиться