2008-11-08 7 views
6

Comment vérifier une connexion ouverte dans jdbc pour la base de données Oracle?vérification par programmation de la connexion ouverte dans JDBC

Remarque: conn.isClosed() ne peut pas être utilisé pour cela.

+0

Est-ce que vous voulez savoir si votre application a une connexion ouverte ou voulez-vous savoir si le DB dispose d'une connexion ouverte à n'importe quoi. – sblundy

+0

Je souhaite implémenter le pool de connexions. –

+0

check it out [statut de connexion Java JDBC] (http://stackoverflow.com/a/30888132/782535) –

Répondre

2

Généralement, un pool de connexions utilise également la méthode Connection.isClosed() pour vérifier si la connexion est toujours valide. Le problème est que tous les pilotes JDBC ne géreront pas correctement cet appel. Donc, je suppose qu'il y a quelques déclarations de vérification simples, comme RealHowTo a dit. Pour Oracle, il a déjà mentionné le "SELECT 1 FROM Dual" qui devrait toujours réussir pour les bases de données Oracle. Je pense qu'il existe des requêtes similaires pour la base de données différente. Je me souviens que dans un projet précédent, nous avons également mis en place un propre pool de connexions qui utilisait de telles requêtes de validation.

8

Quelque chose comme:

Statement stmt = null; 
ResultSet rs =null; 
try { 
    stmt = conn.createStatement(); 
    // oracle 
    rs = stmt.executeQuery("SELECT 1 FROM Dual"); 
    // others 
    // rs = stmt.executeQuery("SELECT 1"); 
    if (rs.next()) 
     return true; // connection is valid 
} 
catch (SQLException e) { 
    // TODO : log the exception ... 
    return false; 
} 
finally { 
    if (stmt != null) stmt.close(); 
    if (rs != null) rs.close(); 
} 

Notez que si la connexion provient d'un pool de connexion (dans un serveur d'applications, par exemple), le Fonds peut avoir un mécanisme permettant de vérifier si une connexion est valide ou non. Avec BEA, vous spécifiez le SELECT dans la propriété "test-sur-réserve".

Si vous développez votre propre pool, vous pouvez jeter un oeil à la façon dont les autres le font (par exemple Proxool).

+0

En fonction de votre environnement, votre pool de connexions DEVRAIT vérifier la connexion. Sinon, si vous perdez la connectivité à la base de données, vous devez généralement redémarrer votre serveur d'applications pour redémarrer le pool. –

+0

Je soupçonne fortement que executeQuery lancera une exception SQLException si la connexion est fermée. –

1

Voir this publication. Les solutions référencées sont similaires à celle affichée ici (requête rapide contre DUAL pour valider) mais il existe également une solution intéressante fournie par JBoss spécifique à Oracle en utilisant la méthode propriétaire PING dans la classe Oracle JDBC Connection. Voir le code here.

// Nicholas

+0

Notez que tout pingDatabase (int) fait dans le pilote Type IV est un «select 'x' à partir de dual;" – leonigmig

1

Utilisation pingDatabase(int timeout) Mis en œuvre en OracleConnection depuis 9.0.1

+0

Notez que tout pingDatabase (int) fait dans le pilote Type IV est un «select 'x' à partir de dual;" – leonigmig

Questions connexes