Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi dois-je vider le pool de connexions à chaque redéploiement ?

Votre cause première, PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure est lié à ce bogue Glassfish , qui explique (dans l'onglet commentaires en bas) que vous devrez peut-être actualiser vos connexions invalides.

Le commentaire de bogue par Jagadish dit de vérifier votre type de validation de connexion. S'il est défini sur "autocommit" (valeur par défaut), les pilotes JDBC peuvent mettre en cache les données de validation de connexion précédentes, et aucune interaction réelle avec la base de données ne se produira lors des futures validations de connexion.

Pour résoudre le problème, définissez connection-validation-method="table" et validation-table-name="any_table_you_know_exists" (remplacez any_table_you_know_exists avec le nom d'une table existante). Cela oblige les connexions à communiquer avec la base de données au lieu du cache ; si la connexion n'est pas valide, elle sera abandonnée et recréée. Vous devrez peut-être également spécifier is-connection-validation-required="true" .

Articles d'aide à la configuration supplémentaire :

  1. Cet article explique également le problème en détail.
  2. Article du blog Oracle de Jagadish sur ce sujet contient plus d'informations.
  3. Article expliquant en détail la validation de connexion Glassfish JDBC.

Texte du blog de Jagadish :

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required=true
domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required = true

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method=table
domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method = table

bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name=sys.systables
domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name = sys.systables

Notez que l'exemple de code fait référence à sys.systables , qui est une table MS SQL dont l'existence est garantie. Pour Oracle, se référer à la table garantie dual . Pour MySQL, créez une table à 1 colonne uniquement à des fins de validation ; jouez la sécurité et préremplissez le tableau en insérant une ligne de données.