2013-01-18 6 views
9

Ich habe ein Problem bei der Verbindung zu einer Oracle-Datenbank, es dauert eine lange Zeit (ca. ~ 5 Minuten) und es sendet die unten gezeigte Ausnahme. Die meiste Zeit, nach dem ersten Fehler, funktionieren die nächsten Verbindungen für denselben Prozess korrekt.Java OracleDB Verbindung dauert zu lange beim ersten Mal

Es ist eine RHEL 6 Maschine, mit zwei verschiedenen Netzwerkschnittstellen und IP-Adressen.

HINWEIS: Ich verwende keine URL wie: "jdbc: oracle: dünn: @xxxx: yyy, es ist eigentlich:" jdbc: oracle: dünn: @xxxx: yyyy: zzz. Die SID fehlt nicht, sorry dafür :(

Das ist ungefähr das, was ich isoliert habe:

bin/java -classpath ojdbc6_g.jar -Djavax.net.debug = all -Djava .util.logging.config.file = logging.properties

Class.forName ("oracle.jdbc.OracleDriver") 
DriverManager.getConnection("jdbc:oracle:thin:@xxxx:yyyy", "aaaa", "bbbb") 

Fehler Stacktrace:

java.sql.SQLRecoverableException: IO Error: Connection reset 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:533) 
     at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:557) 
     at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:233) 
     at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:29) 
     at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:556) 
     at java.sql.DriverManager.getConnection(DriverManager.java:579) 
     at java.sql.DriverManager.getConnection(DriverManager.java:221) 
     at test.jdbc.Main(Test.java:120) 
Caused by: java.net.SocketException: Connection reset 
     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) 
     at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
     at oracle.net.ns.DataPacket.send(DataPacket.java:248) 
     at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:227) 
     at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:309) 
     at oracle.net.ns.NetInputStream.read(NetInputStream.java:257) 
     at oracle.net.ns.NetInputStream.read(NetInputStream.java:182) 
     at oracle.net.ns.NetInputStream.read(NetInputStream.java:99) 
     at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:121) 
     at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:77) 
     at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1173) 
     at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:309) 
     at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:200) 
     at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404) 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:430) 
     ... 35 more 

Es gibt ein sehr ausführliches Protokoll von dem, was geschieht hier über: http://pastebin.com/MMFKU26z Die Linie, die hier stecken bleiben, sagt stellt die 5 Minuten Wartezeit

+0

Ich denke, es ist mit den beiden Netzwerkschnittstellen verwandt. Ist es möglich, dass es zu dem falschen führt, die Zeit abläuft und dann die richtige verwendet? –

+0

Ich denke auch, gibt es eine Möglichkeit, dies zu überprüfen? – iamedu

Antwort

12

Sie stoßen wahrscheinlich auf ein Problem mit dem Oracle JDBC-Treiber, der standardmäßig einen blockierenden Zufallszahlengenerator unter Linux verwendet. Versuchen Sie, Java mit dem folgenden Argument auszuführen:

-Djava.security.egd=file:/dev/./urandom 

Alternativ können Sie einen Daemon starten, um den Zufallszahlengenerator zu versorgen. Der Linux "rngd" -Daemon ist ein Beispiel.

Quellen:

+0

ich wünschte, ich könnte diese mehr Stimmen geben. Dies alles mit meinen langsamen Verbindungen zu Orakel auf meinem Überwachungssystem behoben ... läuft auf Ubuntu 14.04.3 LTS. –

1

in Ihrer Verbindungszeichenfolge Blick scheint es, dass Oracle-Service-Namen oder SID fehlt. Die Verbindungszeichenfolge sollte wie folgt aussehen: "jdbc:oracle:thin:@xxxx:yyyy/zzz", wobei zzz die SID ist. Sie können sich auch die Antwort auf this question ansehen.

+0

Bitte lesen Sie die Frage sorgfältig: * Die meiste Zeit, nach dem ersten Fehler, funktionieren die nächsten Verbindungen für denselben Prozess korrekt. * – Andremoniy

+1

@Andremoniy Der von Ihnen zitierte Frageteil kann ein Ergebnis des TNS-Listener-Verhaltens sein. Aus der Sicht eines TNS-Listeners kann es also so aussehen: Ein Client baut eine Verbindung auf, sagt aber nicht, welchen bestimmten Dienst er verwenden möchte.Der Listener wartet einige Zeit und setzt die Verbindung schließlich zurück. Wie auch immer, das Format der Verbindungszeichenfolge im Beispielcode ist falsch - deshalb habe ich es angesprochen. –

+0

Entschuldigung !!! Mein schlechtes, wenn ich die Parameter versteckte, vergaß ich die SID, aber es ist dort die tatsächliche Form ist: "jdbc: oracle: dünn: @xxxx: yyyy: zzz" – iamedu