web-dev-qa-db-fra.com

Oracle DB: Java.sql.SQLException: Connexion fermée

Raisons de Java.sql.SQLException: Connexion fermée à partir d'Oracle?

Java.sql.SQLException: Connexion fermée à Oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.Java:112) à Oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.Java:112) à Oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.Java:146) à Oracle.jdbc.driver .throwSqlException (DatabaseError.Java:208) à Oracle.jdbc.driver.PhysicalConnection.commit (PhysicalConnection.Java:1131) à Oracle.jdbc.OracleConnectionWrapper.commit (OracleConnectionWrapper.Java:117)

Nous obtenons cette erreur de la connexion à la base de données avec basculement. Nous utilisons également le même code pour d'autres bases de données. Mais voir ce problème avec une seule des bases de données. Est-ce parce que la connexion peut avoir un délai d'expiration en raison d'une longue période d'inactivité et que nous essayons de l'utiliser? Pls faites-moi savoir si vous avez besoin de plus de détails ...

AbandonedConnectionTimeout défini sur 15 min InactivityTimeout défini sur 30 min

33
Java Guy

Cela signifie que la connexion a été établie avec succès à un moment donné, mais lorsque vous avez essayé de valider sur place, la connexion n'était plus ouverte. Les paramètres que vous avez mentionnés ressemblent à des paramètres de pool de connexions. Si c'est le cas, ils ne sont pas liés à ce problème. La cause la plus probable est un pare-feu entre vous et la base de données qui tue les connexions après un certain temps d'inactivité. Le correctif le plus courant consiste à obliger votre pool de connexions à exécuter une requête de validation lorsqu'une connexion est extraite de celui-ci. Ceci identifiera et éliminera immédiatement les connexions mortes, garantissant que vous n'obtiendrez que de bonnes connexions hors du pool.

44
Ryan Stewart

Vous devez valider la connexion.

Si vous utilisez Oracle, vous utiliserez probablement niversal Connection Pool de Oracle. Ce qui suit suppose que vous le faites.

Le moyen le plus simple de valider la connexion consiste à indiquer à Oracle que la connexion doit être validée lors de son emprunt. Cela peut être fait avec

pool.setValidateConnectionOnBorrow(true);

Mais cela ne fonctionne que si vous maintenez la connexion pendant une courte période. Si vous empruntez la connexion pour une période plus longue, il est probable que la connexion se brise pendant que vous la maintenez. Dans ce cas, vous devez valider explicitement la connexion avec

if (connection == null || !((ValidConnection) connection).isValid())

Voir le documentation Oracle pour plus de détails.

9
ceving