Pré-lié Connexion JDBC trouvé
Nous avons une application qui utilise hibernate, spring, et DB2 dans websphere 7. Nous avons déclencheurs d'audit et nous devons nous fixer pour les déclencheurs peuvent savoir à l'utilisateur connecté (nous utilisons le générique d'ouverture de session dans la base de données). Nous sommes venus avec un nouveau plan de la définition de cette dans une nouvelle application afin qu'il puisse rejoindre automatiquement de nouvelles transactions. Nous avons remplacé le gestionnaire de transactions et a fait le travail dans le doBegin.
Ces système a très bien fonctionné dans une application, et semblait fonctionner à merveille dans une deuxième application, mais maintenant, quelques semaines plus tard, et pas de manière systématique (ce comportement est intermittente, et ne se fait pas dans le développement local), nous obtenons cette Pré-lié Connexion JDBC trouvé d'erreur. Regarder en ligne la plupart des postes de dire que c'est lorsque vous utilisez deux gestionnaires de transactions sur une source de données. C'est maintenant ce que nous faisons.
J'ai aussi lu un post je me demandais si c'était parce qu'il s'est mélangé les annotations et les AOP à base de transactions. Cette application fait partie de cela. Je n'ai pas vraiment acheter que de la théorie, mais pensé que je le mentionne.
Exception:
Caused by:
org.springframework.transaction.IllegalTransactionStateException: Pre-bound JDBC Connection found! HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.
at java.lang.Throwable.<init>(Throwable.java:67)
at org.springframework.core.NestedRuntimeException.<init>(NestedRuntimeException.java:54)
at org.springframework.transaction.TransactionException.<init>(TransactionException.java:34)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:475)
at gov.usdoj.afms.umc.utils.hibernate.AfmsHibernateTransactionManager.doBegin(AfmsHibernateTransactionManager.java:28)
Code (notez qu'à l'exception de la super.doBegin()):
protected void doBegin(Object arg0, TransactionDefinition arg1) {
super.doBegin(arg0, arg1);
if (!Db2ClientInfo.exists()) {
clearDBProperty();
} else {
setDBProperty(Db2ClientInfo.getClientUserId(), Db2ClientInfo.getClientApplicationId());
}
}
private void setDBProperty(String uId, String appName) {
Session session = getSessionFactory().getCurrentSession();
Properties props = new Properties();
props.setProperty(WSConnection.CLIENT_ID, uId);
props.setProperty(WSConnection.CLIENT_APPLICATION_NAME, appName);
try {
Connection nativeConn = new SimpleNativeJdbcExtractor().getNativeConnection(session.connection());
if (nativeConn instanceof WSConnection) {
WSConnection wconn = (WSConnection) nativeConn;
wconn.setClientInformation(props);
} else {
logger.error("Connection was NOT an instance of WSConnection so client ID and app could not be set");
}
} catch (Exception e) {
throw new RuntimeException("Cannot set DB parameters!", e);
}
}
OriginalL'auteur Entropy | 2013-08-23
Vous devez vous connecter pour publier un commentaire.
Je viens de réaliser que je n'ai jamais répondu à cette question. Il s'avère que l'exception n'avaient rien à voir avec notre Tx manager. C'était le fait que cette OREILLE particulière a deux applications, chacune pointant vers la même source de données. Évidemment, tout cela se confond mise en veille prolongée. Nous avons des plans pour séparer les apps un jour, mais la création d'un identique (sauf de nom) source de données et en pointant les applications à eux séparément résout le problème pour l'instant.
OriginalL'auteur Entropy
Au lieu de modifier le gestionnaire de transactions, il peut être plus facile (mieux?) pour créer un wrapper autour de votre source de données (extension de
DelegatingDataSource
à partir du printemps) et de remplacer les 2 getConnection méthodes. Pour le nettoyage, vous pouvez rassembler la connexion à un proxy et intercepter la méthode close.Que devrait être l'une des plus sûres et plus facile je suppose), alors essayer de jouer avec le gestionnaire de transactions et il fonctionne pour toutes les technologies (JDBC, Hibernate, JPA, etc.) tant que vous utilisez le enveloppés de la source de données. (L'enregistrement peut être fait avec un
BeanPostProcessor
qui détecteDataSource
instances et simplement les enveloppe dans du délégué).Si c'est radical (comme il les moyens de changer vos applications en cours au lieu de la mise à jour d'une bibliothèque). Il pourrait être un problème de configuration, assurez-vous que vous êtes seulement de chargement de votre configuration (et donc de la source de données et TransactionManager) qu'une seule fois, la duplication de haricots instances pourraient conduire à une similair comportement.
Et oui, je suis convaincu que je suis que le chargement de la configuration une fois.
Plus sûr en raison du fait que, si quelqu'un oublie @Transactionnelle (ou si votre coupe transverse (pointcut) ne correspond pas) les propriétés sont encore ensemble (tout le monde doit utiliser la source de données). Mais à mon humble avis c'est bien sûr. Le premier argument passé dans le
doBegin
méthode doit être unHibernateTransactionObject
ce qui devrait avoir une poignée pour la connexion correcte (après lasuper.doBegin()
). Au lieu d'utiliser hibernate utiliser le déjà lié connexion à partir de laHibernateTransactionObject
.OriginalL'auteur M. Deinum
Pour la postérité, je viens d'avoir ce problème et les réponses ici n'étaient pas très utiles. Nous avons résolu le problème en supprimant un double de l'importation d'un fichier XML qui avait l'AOP gestionnaire de transactions définition:
Je pense qu'il cause il y à 2 gestionnaires de transactions qui se chevauchent le même espace de noms. Pour le résoudre, nous avons déménagé les importations autour de sorte qu'ils étaient en train d'être fait une fois.
Espère que cela aide quelqu'un d'autre.
OriginalL'auteur Gray