2009-07-06 3 views
11

Sto attraversando un problema con il pooling di connessioni Oracle tramite OracleConnectionCacheImpl. Quando mi collego a un pool di connessioni sul mio server di database (Oracle 10g) tramite il driver sottile, tutto funziona correttamente fino a dopo un tempo non specificato, la connessione db viene interrotta (probabilmente a causa di connessioni inattive?) E viene visualizzato un messaggio di errore:Come ricollegare automaticamente il pool di connessioni Oracle dopo l'interruzione della connessione?

Connessione chiusa.

L'aggiornamento della pagina e il nuovo tentativo di connessione ricollegano il database, quindi non sembra essere un problema con la rete o il database. È un modo per il pool di connessioni Oracle di convalidare la propria connessione e riconnettersi se la connessione nel pool è morta per qualsiasi motivo?

Sto usando Apache Tomcat 6.0.18, aggiornamento di Java EE6 11.

(Sembra che ci sia una funzione di ping nel driver sottile Oracle. Fa quell'aiuto e dove posso trovarlo?)

+2

1) è possibile aggiungere l'intera analisi dello stack per connessione chiusa 2) è stata impostata su InactivityTimeout, TimeToLiveTimeout o AbandonedConnectionTimeout ad eventuali valori non predefiniti? 3) Utilizzi ValidateConnection? –

+0

4) Le connessioni fisiche tra il server delle applicazioni e il server DB vengono interrotte a livello di rete, ad es. da un firewall? –

+0

Dove posso impostare questi parametri? Sono nuovo nella programmazione di Oracle, quindi non sono sicuro di dove trovare questi parametri. Dove posso trovare ValidateConnection e forzare una riconnessione? (Semplicemente aggiornare il mio browser subito dopo aver visto l'errore risolverà le cose immediatamente.Non sono sicuro che questo sia un problema del firewall.) – futureelite7

risposta

-1

Utilizzare un'altra libreria del pool di connessioni, ad esempio C3P0, e utilizzare la funzionalità per l'automatico reconnect.

0

Apache DBCP (pool di connessione DB) sarà d'aiuto. È possibile configurare con un parametro 'validationQuery', che è una query SQL da eseguire su una connessione rimossa dal pool PRIMA che glielo conceda. Se la query fallisce, la connessione viene scartata e ne viene creata una nuova che ti viene data.

Vedere qui http://commons.apache.org/proper/commons-dbcp/configuration.html per ulteriori dettagli.

Nota, la convalidaQuery verrà chiamata ogni volta che si ottiene una connessione dal pool, quindi deve essere il più veloce possibile. ad esempio:

SELECT id FROM users LIMIT 1; 
0

È possibile aggiungere alcuni parametri di configurazione in modo che context.xml pool di connessioni Tomcat si prenderà cura delle connessioni morti. Ecco un esempio di context.xml, per favore usa l'utente/password/url/ports in base alle tue impostazioni.

<?xml version="1.0" encoding="UTF-8"?> 
<Context path=""> 
    <!-- Specify a JDBC data source --> 
    <Resource name="jdbc/db" auth="Container" 
       type="javax.sql.DataSource" 
       username="user" 
       password="password" 
       driverClassName="driver.class.fullpath" 
       url="jdbc:oracle://localhost:3306/ 
       maxActive="50" 
       maxIdle="10" 
       testOnBorrow="true" 
       testWhileIdle="true" 
       validationQuery="/* ping */" 
       removeAbandoned="true" 
       logAbandoned="true"/> 
</Context>