Wie geht man mit einem "Got minus one from a read call" Fehler um, wenn man sich mit einer Amazon RDS Oracle Instanz verbindet

Ich führe Oracle 11GR2 auf einer Amazon RDS-Instanz aus. Gelegentlich erhalte ich einen IO Error: Got minus one from a read call beim Aufruf von DriverManager.getConnection(getUrl()) und ich bin mir nicht sicher warum. Andere Anwendungen funktionieren korrekt.

Um die Dinge weiter zu verwirren, korrigiert sich der Fehler gelegentlich selbst (nach der nächsten Iteration des Programms).

Wie gehe ich mit einem "Got minus one from a read call" Fehler um??

Vollständiger Stack-Trace:

java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:243)
    at com.cwd.facile.db.Database.<init>(Database.java:44)
    at com.cwd.facile.ns.NetSuiteRequestBased.<init>(NetSuiteRequestBased.java:29)
    at com.cwd.facile.ns.CommonOperations.isInventoryItem(CommonOperations.java:205)
    at com.cwd.facile.ns.CommonOperations.findItemIdByName(CommonOperations.java:188)
    at com.cwd.facile.ns.CommonOperations.createSalesOrder(CommonOperations.java:970)
    at com.cwd.facile.Main.main(Main.java:47)
Caused by: oracle.net.ns.NetException: Got minus one from a read call
    at oracle.net.ns.Packet.receive(Packet.java:311)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:300)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
    ... 12 more

Database.java Zeile 44: setConn(DriverManager.getConnection(getUrl()));

Andere Informationen:

  • Ich dachte, es sei eine schlechte JDBC-URL, aber es funktioniert, manchmal tagelang, bevor es fehlschlägt.
  • Amazon RDS ist eine verwaltete Instanz und Konfigurationsänderungen sind möglicherweise nicht möglich.
  • Ich verwende ojdbc6.jar für die Konnektivität
Lösung

Die unmittelbare Ursache des Problems ist, dass der JDBC-Treiber versucht hat, von einem Netzwerk-Socket zu lesen, der vom anderen Ende geschlossen wurde.

Dies könnte mehrere Ursachen haben:

  • Wenn der Remote-Server so konfiguriert wurde (z.B. in der Datei "SQLNET.ora"), dass er keine Verbindungen von Ihrer IP akzeptiert.

  • Wenn die JDBC-URL nicht korrekt ist, könnten Sie versuchen, eine Verbindung zu etwas herzustellen, das keine Datenbank ist.

  • Wenn zu viele Verbindungen zum Datenbankdienst offen sind, könnte dieser neue Verbindungen ablehnen.

Angesichts der Symptome halte ich das "zu viele Verbindungen" Szenario für das wahrscheinlichste. Das deutet darauf hin, dass Ihre Anwendung undichte Verbindungen herstellt und diese dann nicht (immer) schließt.

Kommentare (2)

Wir hatten das gleiche Problem und haben es behoben. Im Folgenden finden Sie den Grund und die Lösung.

Problem

Wenn wir eine Datenbankverbindung über den Verbindungspool-Mechanismus erstellen, erstellt der Anwendungsserver (in unserem Fall ist es JBOSS) eine Verbindung, wie im Parameter min-connection angegeben. Wenn Sie 10 Anwendungen laufen haben und jede eine Min-Verbindung von 10 hat, werden insgesamt 100 Sitzungen in der Datenbank erstellt. Außerdem gibt es in jeder Datenbank einen Max-Session-Parameter, wenn Ihre Gesamtverbindung diese Grenze überschreitet, erhalten Sie "Got minus one from a read call" FYI: Verwenden Sie die folgende Abfrage, um Ihre gesamte Sitzung zu sehen

SELECT username, count(username) FROM v$session 
WHERE username IS NOT NULL group by username

Lösung: Mit Hilfe unseres DBAs haben wir die max-session erhöht, so dass alle unsere Anwendungen min-connection unterbringen können.

Kommentare (1)

Ich möchte zu Stephen C's Antwort ergänzen, mein Fall war auf den ersten Punkt. Da wir DHCP für die Zuweisung von IP-Adressen in der Firma verwenden, änderte DHCP die Adresse meines Rechners, ohne natürlich weder mich noch Oracle zu fragen. Aus heiterem Himmel weigerte sich Oracle, irgendetwas zu tun und gab die gefürchtete Minus-Ausnahme. Wenn Sie also dieses Problem ein für allemal umgehen wollen, und da TCP.INVITED_NODES der SQLNET.ora-Datei keine Platzhalter akzeptiert, wie hier angegeben, können Sie den Hostnamen Ihres Rechners anstelle der IP-Adresse hinzufügen.

Kommentare (3)