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:
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?)
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort ist wie folgt (von CentOS Foren):
Siehe auch:
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
-Djava.security.egd=file:///dev/urandom
-Djava.Sicherheit.egd=file:///dev/urandom löste es auch bei mir, und der erste link ist sehr interessant und erklärt das problem, danke!
InformationsquelleAutor ggkmath
Ihre nächste Schritt ist wahrscheinlich damit zu tun, Ihre Studien, die unter einem profiler so können Sie sehen, wo all die Zeit aufgewendet wird. Ich vermute, es wird in einem von diesen low-level socket-Operationen, wie die, die schließlich wirft "connection reset". Wenn das der Fall ist, dein problem ist entweder in Oracle, oder etwas im Zusammenhang mit dem Netzwerk (trotz dass Sie Kreuz verbunden-wer weiß).
Die Art der profiler-ich beziehe mich auf überwacht das Programm, während es ausgeführt wird, und summiert die Zeit, innerhalb von unterschiedlichen Methoden. Dies ist zum Beispiel ein guter: yourkit.com (30-Tage-Testversion)
Hah! Erstaunlich. Ich denke der Letzte Vorschlag in diesem Artikel ist einen Versuch Wert: Ausführen mit java "-Djava.Sicherheit.egd=file:///dev/urandom" (ich nehme an, du bist auf einem Linux/UNIX-Maschine?) Wenn das funktioniert, dann prüfen Sie, ob Ihre Anwendung wird in Ordnung sein, mit pseudo-Zufallszahlen statt der Entropie getrieben, diejenigen, die für die Sicherung Ihrer Verbindungszeichenfolge und was sonst noch. =)
InformationsquelleAutor spieden
Auf Debian
/etc/default/rng-tools
wäre(Omnitted Kommentare)
InformationsquelleAutor Sebastian J.
Starten wir von einem shell-Skript. Ich habe die
-Djava.security.egd=file:///dev/urandom
string als Teil der java Aufruf. Hier ist unsere gesamte Befehlszeile:InformationsquelleAutor Mike Preston