Connexion fermée: prochaine en java
J'ai ResultSet Méthodes dont je suis la fermeture de la Connexion dans une enfin Bloc:
public static ResultSet countdrcountcr(String vforacid) throws SQLException {
ResultSet rs = null;
Connection conn = null;
try {
conn = db.getDbConnection();
String sql = "SELECT NVL (SUM (DECODE (part_tran_type, 'D', 1, 0)), 0), "
+ " NVL (SUM (DECODE (part_tran_type, 'C', 1, 0)), 0) "
+ " FROM tbaadm.htd WHERE acid IN (SELECT acid "
+ " FROM tbaadm.gam WHERE foracid = '" + vforacid + "') "
+ " AND tran_date >= '22-NOV-2013' AND tran_date <= '30-NOV-2013' "
+ " AND pstd_flg = 'Y' AND del_flg != 'Y'";
PreparedStatement ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
return rs;
} finally {
conn.close();
}
}
Mais j'obtiens l'erreur :
modifier l'ensemble de La ErrorTrace
Exception in thread "main" java.sql.SQLException: Closed Connection: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:181)
at statement.Statement.main(Statement.java:34)
Java Result: 1
Que suis-je pas en train de faire?
- Pouvez-vous indiquer la ligne que l'erreur se produit et de mettre votre stacktrace sur votre question s'il vous plaît.
- Vous êtes à la fermeture de la connexion mais toujours en utilisant le jeu de résultats.
- Oui je suis retourné à la valeur avant la Fermeture. L'erreur se présente Quand j'essaie d'appeler ce ResultSet
while(rs1.next())
Vous devez vous connecter pour publier un commentaire.
Vous êtes de retour d'une
ResultSet
pour une utilisation future, mais après l'avoir utilisé, vous êtes à la fermeture de la connexion, vous n'avez donc aucun moyen de récupérer les données depuis la ressource est déjà fermé. Notez quefinally
est toujours appelé, même si vous retourner quelque chose dans letry
oucatch
bloc de code, reportez-vous à N'a finalement toujours exécuter en Java?Dans le détail, c'est le problème:
PreparedStatement
et laResultSet
associées à l'actuelConnection
) parce que, comme indiqué dans le lien avant d',finally
bloc est toujours exécutée à moins que la machine se bloque ou que vous terminer manuellement l'application à l'aideSystem.exit
.ResultSet
. Il est fermé en raison de l'étape précédente.Une solution possible serait que votre
countdrcountcr
méthode et toutes les autres méthodes qui renvoient uneResultSet
recevoir leConnection
comme paramètre, la méthode qui l'appelle, il va gérer la connexion d'ouverture et de fermeture. Aussi, prenez note que vous ne devriez pas utiliserstatic
des méthodes pour gérer vos opérations de base de données si vous travaillez dans un environnement multithread par exemple, une application web.Je pense que votre requête est de prendre du temps pour s'exécuter et obtenir résilié par le pilote/tomcat niveau.
Vous de vérifier le contexte de l'application fichier xml pour le paramètre removeAbandonedTimeout valeur.
removeAbandonedTimeout=300
signifie que, si une requête en cours d'exécution de plus de 300 secondes sera de près par le pilote JDBC. Ceci est fait pour éviter le pool de connexion de "fuite". Pour y remédier, vous pouvez définir la valeur avec le plus grand nombre.
Plus d'infos à propos de ce param et d'autres paramètres peuvent être trouvés ici
Vous êtes à la clôture du sous-jacent
Connection
dans votre bloc finally... Vous n'êtes pas la fermeture de la PreparedStatement (et vous devez, mais vous devez fermer qu'après l'utilisation de votreResultSet
trop). utiliser le bloc finally de l'appelant (où vous ouvrez leConnection
). Aussi, vous pouvez envisager d'utiliser setFetchSize().Vous ne pouvez pas fermer une
Connection
puis utilisez leResultSet
. Vous avez fini d'utiliser leResultSet
d'abord, puis de fermer laConnection
peu de temps après. Le rythme normal est de terminer votre travail avec leResultSet
un premier temps, généralement dans un "Data Access Object", et revenir quelques encapsulé représentation des données sous forme d'un objet.Si u tryied de fermer la connexion à l'intérieur de la tout en bloc cette époque, u peut obtenir ce genre d'exception...donc fermer la connexion après le tout en bloc
Comme dis ci-dessus: Aussi, prenez note que vous ne devriez pas utiliser des méthodes statiques pour gérer vos opérations de base de données si vous travaillez dans un environnement multithread par exemple, une application web.
Qui a vraiment aider.