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

У меня на сервере приложений есть очень простая 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, чтобы изменить его?)

Ответы [ 4 ]

6 голосов
/ 06 марта 2012

Ответ следующий (с форумов 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.

См. Также:

http://www.linuxfromscratch.org/hints/downloads/files/entropy.txt

http://www.usn -it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

https://www.centos.org/modules/newbb/viewtopic.php?topic_id=36209&start=0#forumpost156856

https://forums.oracle.com/forums/thread.jspa?messageID=3793101

0 голосов
/ 25 июля 2012

Мы запускаем из сценария оболочки. Я включил строку -Djava.security.egd=file:///dev/urandom как часть вызова Java. Вот вся наша командная строка:

/usr/bin/java -Xms64m -Xmx1024m -Djava.security.egd=file:///dev/urandom -jar $1 $2 $PID
0 голосов
/ 04 апреля 2012

В Debian /etc/default/rng-tools будет

HRNGDEVICE="/dev/urandom"
RNGDOPTIONS="-o /dev/random -t 1 -b"`

(опущенные комментарии)

0 голосов
/ 06 марта 2012

Ваш следующий шаг, вероятно, состоит в том, чтобы пройти испытания под профилировщиком, чтобы вы могли видеть, где все время тратится. Я предполагаю, что это будет в одной из тех операций сокета низкого уровня, как та, которая в конечном итоге выдает «сброс соединения». Если это так, то ваша проблема либо в Oracle, либо в чем-то, связанном с сетью (несмотря на то, что вы подключены к сети - кто знает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...