2011-07-22 6 views
27

Raisons pour java.sql.SQLException: Closed Connection from Oracle ??Oracle DB: java.sql.SQLException: Fermé Connexion

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

Nous obtenons cette erreur de l'échec o ver connexion à la base de données. Nous utilisons le même code pour d'autres bases de données. Mais voir ce problème avec seulement une des bases de données. Est-ce parce que la connexion peut avoir un délai d'attente en raison d'une longue période d'inactivité et que nous essayons d'utiliser cela? Merci de me faire savoir si vous avez besoin de plus de détails ...

AbandonedConnectionTimeout mis à 15 minutes InactivityTimeout jeu à 30 minutes

Répondre

32

Cela signifie que la connexion a été établie avec succès à un moment donné, mais quand vous avez essayé de commettre là , la connexion n'était plus ouverte. Les paramètres que vous avez mentionnés ressemblent aux paramètres du pool de connexions. Si oui, 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é. La solution la plus courante consiste à faire en sorte que votre pool de connexions exécute une requête de validation lorsqu'une connexion est extraite de ce pool. Cela permettra d'identifier et d'expulser immédiatement les connexions mortes, en s'assurant que vous n'obtiendrez que de bonnes connexions hors de la piscine.

+0

merci pour la réponse. La propriété de connexion de validation ajoute-t-elle un surcoût? Je ne vois cela qu'avec l'un des DB, je doute aussi que quelque chose ne va pas avec cette DB paticular. –

+4

Il va naturellement ajouter un peu de surcharge, car il doit réellement frapper la base de données afin de valider la connexion; Cependant, chaque base de données a une «requête de validation» recommandée à utiliser qui implique une charge minimale sur le côté de la base de données, de sorte que le seul ralentissement que vous obtiendrez provient de la latence du réseau. Indépendamment du problème, l'ajout d'une requête de validation est un moyen assez infaillible pour éviter d'avoir des connexions mortes du pool. Je crois que la requête actuelle recommandée pour Oracle est 'select 1 from dual' –

8

Vous devez valider la connexion.

Si vous utilisez Oracle, il est probable que vous utilisiez Oracle Universal Connection Pool. Ce qui suit suppose que vous le faites. La méthode la plus simple pour valider la connexion est de dire à Oracle que la connexion doit être validée en l'empruntant. Cela peut être fait avec

pool.setValidateConnectionOnBorrow(true); 

Mais il ne fonctionne que si vous maintenez la connexion pendant une courte période. Si vous empruntez la connexion plus longtemps, il est probable que la connexion soit brisée pendant que vous la maintenez. Dans ce cas, vous devez valider la connexion explicitement

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

Voir la Oracle documentation pour plus de détails.

+0

Si vous ne pouvez pas utiliser UCP ou ne voulez pas faire face à la céphalée des artefacts Oracle ne sont pas disponibles sur les référentiels maven publics, je viens de découvrir que java.sql.Connection a une méthode isValid. Cela fonctionne sur un timeout. – obesechicken13

+0

Et oracle.ucp.jdbc.IsValid de ValidConnection provoque le blocage de mon enregistreur planifié sur une exception java.lang.ClassCastException – obesechicken13

Questions connexes