Home > Java und JDBC > JDBC connect time Fehler

JDBC connect time Fehler

Oracle Java

Oracle JDBC Connect Time Fehler

Oracle JDBC IO Errors beim Connect zur Oracle Datenbank beheben

In der letzten Zeit sind uns immer öfter Fehler beim Connect zur Oracle Datenbank aufgetreten. Überraschenderweise konnten wir feststellen, dass diese oft auf die gleiche Ursache zurückzuführen sind, auch wenn sie sich verschieden darstellen. Hier einige Beispiele, wie sich der Fehler zeigt:

Oracle Data Integrator - Version: 10.1.3.6.0 and later

Beim Starten vom ODI kommt es zu folgendem Fehlerstack:

...
com.sunopsis.sql.l: Oracle Data Integrator Timeout: connection with URL jdbc:oracle:thin:@XXXXXXXX:1521:DB1 and user ODI.
at com.sunopsis.sql.SnpsConnection.a(SnpsConnection.java)
at com.sunopsis.sql.SnpsConnection.connect(SnpsConnection.java)
at com.sunopsis.dwg.cmd.e.j(e.java)
at com.sunopsis.dwg.cmd.e.i(e.java)
at com.sunopsis.dwg.cmd.e.A(e.java)
at com.sunopsis.dwg.DwgJv.treatCmd(DwgJv.java)
at com.sunopsis.dwg.DwgJv.main(DwgJv.java)
at oracle.odi.Agent.main(Agent.java)
DwgJv.main: Exit. Return code:-1
Ultimately, the user receives a "java.sql.SQLRecoverableException: IO Error: Connection reset" message, as for example:java.sql.SQLRecoverableException: IO Error: Connection reset at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:421)
at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:531)
at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:221)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverE...

NetApp SnapManager für SAP bzw SnapManager für Oracle

Der Fehler tritt auf verschiedenen Plattformen immer wieder - aber nicht reproduzierbar - auf.

Auszug aus einem SMSAP-LOG File:

2011-10-14 10:28:37,412 [RMI TCP Connection(2)-172.27.6.106] [DEBUG]: Successfully bound to RemoteObjectFactory with GUID a739f59eb0857dd8676fb3a5c314eff7
2011-10-14 10:28:38,638 [RMI TCP Connection(2)-172.27.6.106] [ERROR]: SMSAP-13032: Cannot perform operation: backint -t backup NEW. Root cause: java.rmi.UnmarshalException: Error unmarshaling return
header; nested exception is: java.io.EOFException
java.lang.RuntimeException: java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.io.EOFException
at com.netapp.oracle.jdbc.OracleConnectionFactory.createOCIJDBCConnectionInNewJvm(OracleConnectionFactory.java:111)
at com.netapp.oracle.jdbc.OracleConnectionFactory.createConnection(OracleConnectionFactory.java:87)

Der entscheidende Teil ist "java.io.EOFException".

Die Ursache

Die Ursache ist, dass Oracle JDBC beim Connect eine Zufallszahl für den Initialen SQL*NET Handshake benötigt. Bei vielen Operating Systemen werden zum Berechnen im Zufallsgenerator unter anderem die Tastaturanschläge und die Mausbewegungen verwendet. Sind am Server weder Tastatur noch Maus angeschlossen, führt dies teilweise dazu, dass keine (oder nicht ausreichend) Zufallszahlen zur Verfügung stehen.

Die Lösung

Man kann java.security so konfigurieren, welche Quelle für die Zufallszahlen genutzt werden soll. Dies macht man indem man zuerst die richtige java.security Datei findet. Es handelt sich dabei um jene, die man im Verzeichnis "the jre/lib/security/java.security" der Java Runtime findet, die für das jeweilige Produkt relevant ist.

In dieser Datei editiert man folgenden Eintrag - bzw. fügt diesen hinzu, sofern er nicht vorhanden ist:

securerandom.source=file:/dev/random
## bzw. sofern vorhanden (zB: unter Linux)
securerandom.source=file:/dev/urandom

Mit diesem Trick war es uns möglich Connection Fehler vom JDBC sowohl bei Oracle Produkten (zb: OID) als auch bei NetApp Produkten (zB: SMSAP) erfolgreich zu lösen.