einfaches java-Programm die Verbindung zum Datenbank-server mithilfe von JDBC hat Ausführungszeit unterschiedlichen alle über dem Platz

Habe ich ein sehr einfaches java-Programm (J.java, siehe unten) auf meine application-server, der erfolgreich eine Verbindung zu einer Oracle 11.2 Datenbank auf einem Datenbank-server (beide Server sind Linux CentOS) mit JDBC-thin-Treiber von Oracle.

Wie Sie sehen können, von der setURL-Befehl im Java-code unten, habe ich die Anwendung konfiguriert und die Datenbank-Server zu sitzen neben einander, und Sie sind auf dem gleichen Netzwerk (cross-Kabel miteinander verbunden), so gibt es keine Netzwerk-Verkehr auf diesen (Entwicklungs -) Boxen, außer meinem code.

Das problem ist der Zeitpunkt der Ausführung sehr unterschiedlich. Wenn ich ihn 5 mal, es (scheinbar zufällig) 0,01 Sekunden, oder 10 Sekunden oder 50 Sekunden oder eine minute ausführen. Wenn dauert es über eine minute (grob), das Programm nicht komplett, aber die Fehlermeldung, die unten gezeigt ist, zurückgebracht, statt.

Irgendwelche Ideen, was könnte hier Los?

--------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

Den java-code für: J.java ist:

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/[email protected]: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;
    }
    } 
}

UPDATE 1:

Diese sieht aus wie das potential culpret:

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

Weiss jemand wie man das tatsächlich umsetzen der Lösung (siehe Punkt 3 am Ende-wo würde ich finden diese -Djava.security.egd=file:///dev/urandom zu ändern?)

Versuchen Sie eine andere Methode, in diesem Artikel sagt meta-Daten-Methoden sind langsam in JDBC. theserverside.com/news/1365579/..., Aber ich bin immer noch Neigung in Richtung einige Netzwerk-Probleme, so unwahrscheinlich das klingt (in dieser situation).
Dank skynorth. Ich wählte einfach zum Lesen von Metadaten zu halten, die java-code so einfach wie möglich. Wenn ich ersetzen Sie die Metadaten-Abfrage mit alles andere, wie das Lesen einer Zeile aus einer Tabelle in der Datenbank, das gleiche Ergebnis passiert.
Haben Sie versucht, mit dem DriverManager in java.sql-Paket zu sehen, ob mit der OracleDataSource ist, was ist langsamer? Ich habe noch nie verwendet die OracleDataSource vor, so dass ich dachte, ich würde bitten.

InformationsquelleAutor ggkmath | 2012-03-05

Schreibe einen Kommentar