2009-05-28 10 views
2

J'ai une situation dans laquelle une connexion JDBC place la session Oracle à laquelle elle est attachée dans un état particulier (c'est-à-dire le mode activé DBMS_FLASHBACK). Il est possible que la sortie de ce mode échoue (du moins théoriquement) ce qui signifie que la session est laissée dans l'état par erreur. Dans ce cas, la connexion peut être renvoyée au pool et obtenue par un autre thread avec la session Oracle toujours en mode activé DBMS_FLASHBACK.Une connexion JBoss JDBC peut-elle être invalidée afin qu'elle ne soit pas réapprovisionnée à partir du pool de connexions?

J'ai prouvé que cela se produirait réellement. (JBoss 4.2.1)

Ce qui serait idéal serait d'attraper le SQLException quand la sortie de mode échoue, et marquer la connexion comme "mauvaise" de sorte qu'une fois qu'il a été retourné au pool, JBoss détruirait la connexion et en créer un nouveau.

Mais je ne trouve aucun moyen de marquer la connexion pour une destruction immédiate. Est-ce que quelqu'un connaît un moyen?

Répondre

2

La configuration de votre connexion de base de données Oracle doit contenir un trieur d'exception:

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name> 

Cette tente de déterminer si une exception se produit si la connexion peut être réutilisée ou doit être déconnecté. C'est sur une base de meilleurs efforts, et ne fonctionne pas dans tous les cas. Ma préférence pour les installations de production est mark all exceptions as fatal. Pour ce faire, définissez simplement votre trieur d'exceptions sur org.jboss.resource.adapter.jdbc.GenericExceptionSorter.

0

C'est une bonne question, et je ne connais pas la réponse complète, mais quelques pistes à explorer serait de commencer par le mécanisme de basculement JBoss, où il teste la validité de la connexion. La documentation pour cela est here. Ensuite, dans le SQL qui teste la validité, si quelque chose pouvait être placé qui échouerait si la connexion est en mode activé DBMS_FLASHBACK, JBoss devrait rejeter la connexion. Il teste probablement sur la prochaine demande de connexion, pas quand il est retourné à la piscine, bien que cela devrait être acceptable.