我们有一个在 websphere 7 中使用 hibernate、spring 和 DB2 的应用程序。我们有审计触发器,我们需要设置触发器可以知道登录的用户(我们使用通用登录到数据库)。我们提出了一个新方案,用于在新应用程序中设置它,以便它可以自动加入新交易。我们覆盖了事务管理器并在 doBegin 中完成了工作。
这些方案在一个应用程序中运行良好,并且似乎在第二个应用程序中运行良好,但是现在,几周后,并且不一致(行为是间歇性的,不会在本地开发中发生),我们得到了这个 Pre-bound JDBC Connection found错误。在线查看大多数帖子都说这是当您对一个数据源使用两个事务管理器时。这就是我们现在正在做的事情。
我还阅读了一篇文章,想知道是不是因为他混合了注释和基于 AOP 的事务。这个应用程序做了一些。我并不真正相信这个理论,但我想我会提到它。
例外:
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);
}
}