我们有一个应用程序,该应用程序在Websphere 7中使用hibernate,spring和DB2。我们有审计触发器,我们需要进行设置,以便触发器可以知道已登录的用户(我们使用对数据库的通用登录)。我们提出了一个新方案,用于在新应用中进行设置,以便它可以自动加入新交易。我们覆盖了交易经理,并在doBegin中完成了工作。

这些方案在一个应用程序中效果很好,而在第二个应用程序中效果很好,但是现在,几周后又出现不一致的情况(行为是间歇性的,在本地开发中不会发生),我们得到了这个预绑定(bind)的JDBC连接错误。在线查看大多数帖子都说这是当您针对一个数据源使用两个事务管理器时。这就是我们现在正在做的。

我还读了一篇文章,想知道这是否是因为他混合了注释和基于AOP的事务。这个应用程序可以完成其中的一些任务。我真的不买那个理论,但以为我会提到它。

异常(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)

代码(请注意,异常来自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);
    }
}

最佳答案

我只是意识到我从未回答过。事实证明,该异常与我们的Tx管理器无关。事实是,这个特定的EAR中有两个应用程序,每个应用程序都指向相同的数据源。显然,这使 hibernate 变得困惑。我们计划有一天将这些应用程序分开,但是现在创建一个相同的(名称除外)数据源并将这些应用程序分别指向它们可以解决此问题。

关于spring - 找到预绑定(bind)的JDBC连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18404488/

10-09 09:35