Oracle
 sql >> Database >  >> RDS >> Oracle

c3p0 si blocca su getConnection quando si verifica un errore di rete

Ho riscontrato lo stesso problema. Nel mio caso, è stato causato dal fatto che il driver JDBC non è stato configurato per il timeout in caso di errori del socket. Ho apportato le seguenti aggiunte al mio ComboPooledDataSource C3P0 configurazione:

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);
//--------------------------------------------------------------------------------------

...

Le proprietà del driver Oracle vengono applicate quando C3P0 crea la Connection oggetto. Queste due proprietà in particolare causeranno la generazione di un'eccezione se la connessione socket è inattiva per più di 30 secondi.

Se non ti stai connettendo a un database Oracle, sono disponibili proprietà simili per altri driver JDBC per altri fornitori di database. Alcuni di essi sono mostrati nella parte inferiore di questa pagina .