Oracle
 sql >> Datenbank >  >> RDS >> Oracle

c3p0 hängt bei getConnection, wenn ein Netzwerkfehler auftritt

Ich bin auf das gleiche Problem gestoßen. In meinem Fall wurde es dadurch verursacht, dass der JDBC-Treiber nicht auf ein Timeout bei Socket-Fehlern eingestellt war. Ich habe die folgenden Ergänzungen zu meinem C3P0 ComboPooledDataSource vorgenommen Konfiguration:

cpds = new ComboPooledDataSource();
...

//--------------------------------------------------------------------------------------
// NOTE: Once you decide to use cpds.setProperties() to set some connection properties,
//       all properties must be set, including user/password, otherwise an exception
//       will be thrown
Properties prop = new Properties();
prop.setProperty("oracle.net.CONNECT_TIMEOUT",
    Integer.toString(JDBC_CONNECTION_TIMEOUT_IN_MILLISECONDS));
prop.setProperty("oracle.jdbc.ReadTimeout",
    Integer.toString(JDBC_SOCKET_TIMEOUT_IN_MILLISECONDS));
prop.setProperty("user", username);
prop.setProperty("password", password);
cpds.setProperties(prop);
//--------------------------------------------------------------------------------------

...

Die Eigenschaften des Oracle-Treibers werden angewendet, wenn C3P0 die Connection erstellt Objekt. Insbesondere diese beiden Eigenschaften bewirken, dass eine Ausnahme ausgelöst wird, wenn die Socket-Verbindung länger als 30 Sekunden inaktiv ist.

Wenn Sie keine Verbindung zu einer Oracle-Datenbank herstellen, gibt es ähnliche Eigenschaften für andere JDBC-Treiber für andere Datenbankanbieter. Einige von ihnen werden unten in diese Seite .