2009-07-06 11 views
11

Je rencontre un problème de pooling de connexion Oracle via OracleConnectionCacheImpl. Lorsque je me connecte à un pool de connexion sur mon serveur de base de données (Oracle 10g) via le pilote léger, tout fonctionne correctement jusqu'à une heure non spécifiée, la connexion db est interrompue (probablement en raison de connexions inactives?) Et un message d'erreur:Comment reconnecter automatiquement le pool de connexions Oracle après une interruption de connexion?

Connexion fermée.

Actualiser la page et réessayer la connexion reconnecte la base de données, il ne semble donc pas y avoir de problème avec le réseau ou la base de données. Est-ce un moyen pour le pool de connexions Oracle de valider sa connexion et de se reconnecter si la connexion dans le pool est morte pour une raison quelconque?

J'utilise Apache Tomcat 6.0.18, mise à jour Java EE6 11.

(Il semble y avoir une fonction ping dans le pilote mince Oracle. Est-ce que l'aide et où puis-je trouver?)

+2

1) Pouvez-vous ajouter toute trace de la pile pour la connexion fermée 2) Avez-vous mis InactivityTimeout, TimeToLiveTimeout ou AbandonedConnectionTimeout à des valeurs non par défaut? 3) Utilisez-vous ValidateConnection? –

+0

4) Les connexions physiques entre le serveur d'applications et le serveur de base de données sont-elles coupées au niveau du réseau, par ex. par un pare-feu? –

+0

Où dois-je définir ces paramètres? Je suis nouveau à la programmation Oracle, donc je ne suis pas sûr où trouver ces paramètres. Où puis-je trouver ValidateConnection et forcer une reconnexion? (Rafraîchir simplement mon navigateur juste après que je vois que l'erreur corrigera les choses immédiatement, je ne sais pas s'il s'agit d'un problème de pare-feu.) – futureelite7

Répondre

-1

Utilisez une autre bibliothèque de pools de connexions, telle que C3P0, et utilisez la fonctionnalité reconnect automatique.

0

Apache DBCP (pool de connexions DB) aidera ici. Vous pouvez configurer avec avec un paramètre 'validationQuery', qui est une requête SQL à exécuter sur une connexion supprimée du pool AVANT de vous le donner. Si la requête échoue, la connexion est supprimée et une nouvelle connexion est créée.

Voir ici http://commons.apache.org/proper/commons-dbcp/configuration.html pour plus de détails. Notez que la validationQuery sera appelée chaque fois que vous obtenez une connexion du pool, elle doit donc être aussi rapide que possible. Par exemple:

SELECT id FROM users LIMIT 1; 
0

Vous pouvez ajouter des paramètres de configuration dans le fichier context.xml afin que le pool de connexions Tomcat prenne en charge les connexions inactives. Voici un exemple de context.xml s'il vous plaît utiliser l'utilisateur/mot de passe/url/ports etc selon vos paramètres.

<?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>