2010-12-03 3 views
4

Est-ce que BoneCP (ou tout autre pool) ferme les instructions de connexion lorsque la connexion est renvoyée au pool? Si je comprends bien, il n'appelle pas la méthode de fermeture de la connexion réelle, donc il n'y a pas de fermeture automatique de la déclaration. Donc, ferme-t-il les déclarations d'une autre manière ou dois-je les fermer manuellement?Est-ce que BoneCP (ou tout autre pool) ferme les instructions de connexion lorsque la connexion est renvoyée au pool?

Répondre

5

La spécification JDBC n'est pas très claire sur ce qui devrait se produire en cas de fermeture de connexion normale, quel que soit le pool que vous utilisez, vous devez toujours veiller à fermer manuellement les instructions. Réfléchissez à ce qui arriverait à votre application si vous choisissez de passer à un autre pool à l'avenir qui ne correspond pas à vos attentes. En ce qui concerne BoneCP, la réponse est non, il ne fermera pas vos déclarations pour vous, bien qu'il puisse être configuré pour fermer vos connexions si vous oubliez. C'est pour des raisons de performances, car certains pilotes JDBC fermeront toutes les instructions actives en interne si vous fermez la connexion. Toutefois, BoneCP fermera toutes les instructions mises en cache si vous avez activé la mise en cache des instructions.

EDIT: À partir de la version 0.8.0, le support a été ajouté pour fermer les instructions non fermées (+ trace de la pile d'impression de l'emplacement où l'instruction a été ouverte si vous le souhaitez).

1

BoneCP (0.8.0 -RC3), il y a 2 résultats possibles,

fermer avec une certaine configuration pour non-déclaration en cache que

non fermer, peu importe la façon dont vous configurez pour l'instruction en cache même si vous appelez le statement.close() explicitement.

Il existe une classe StatementCache pour mettre en cache l'état callableStatement & prepareStatement. La valeur par défaut est désactivée. Vous devez appeler BoneCPConfig.setStatementsCacheSize() avec le paramètre> 0 pour l'activer. Après avoir activé le cache,

1 BoneCP.Statement.Close() ignorera la fermeture de l'instruction sous-jacente si elle est mise en cache.

public void close() throws SQLException { 
     this.connectionHandle.untrackStatement(this); 
    this.logicallyClosed.set(true); 
    if (this.logStatementsEnabled){ 
     this.logParams.clear(); 
     this.batchSQL = new StringBuilder(); 
     } 

     if (this.cache == null || !this.inCache){ // no cache = throw it away right now 
      this.internalStatement.close(); 
    } 
} 

2 BoneCP.Connection.close() Est-ce tout simplement effacer le cache via la fonction "clearStatementCaches()"

Les bonnes nouvelles sont pilote JDBC MYSQL, connecteur/J, fermera ses portes tous les instructions ouvertes lorsque vous fermez la connexion via la fonction "closeAllOpenStatements()"

Questions connexes