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