我们有一个使用 Weblogic 池化非 XA SQL Server JDBC 驱动程序的应用程序。这是导致问题的原因的流程。
从数据源获取连接。
将自动提交设置为 false。
创建 CallableStatement。
设置参数。
调用执行更新。
- 在存储过程调用中,数据库引发错误,SET XACT_ABORT 为 ON
应用程序在 CallableStatement 的输出参数中看到错误代码。
关闭 CallableStatement
在连接上调用回滚。
抛出异常:
2013 年 10 月 17 日 16:45:20.500 EDT||XXXXXXX|asyncDelivery9|XXX|XXX|XXXX-a3436e48-1672-4a26-88c0-50b9954f6a42|ERROR|XXXXX|rollBack|服务器无法恢复交易。描述:4200000012。com.microsoft.sqlserver.jdbc.SQLServerException:服务器无法恢复事务。描述:4200000012。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) ~[sqljdbc4.jar:na] 在 com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:254) ~[sqljdbc4. jar:na] 在 com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:84) ~[sqljdbc4.jar:na] 在 com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:39) ~[sqljdbc4.jar:na] 在 com.microsoft.sqlserver.jdbc.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:
连接已关闭。
然后应用程序下次尝试从数据源获取连接时,会抛出以下错误:
java.sql.SQLException: Failed to setAutoCommit to true for pool connection: First we got The server failed to resume the transaction. Desc:4200000012., then we got The server failed to resume the transaction. Desc:4200000012.
at weblogic.jdbc.wrapper.PoolConnection.init(PoolConnection.java:70) ~[wlfullclient.jar:12.1.1.0]
at weblogic.jdbc.common.internal.RmiDataSource.getPoolConnectionObj(RmiDataSource.java:639) ~[wlfullclient.jar:12.1.1.0]
at weblogic.jdbc.common.internal.RmiDataSource.getPoolConnection(RmiDataSource.java:478) ~[wlfullclient.jar:12.1.1.0]
at weblogic.jdbc.common.internal.RmiDataSource.getConnectionInternal(RmiDataSource.java:558) ~[wlfullclient.jar:12.1.1.0]
at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:518) ~[wlfullclient.jar:12.1.1.0]
at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:511) ~[wlfullclient.jar:12.1.1.0]
在 Weblogic 日志中,记录了以下内容:
<Oct 15, 2013 3:07:50 PM EDT> <Warning> <JDBC> <BEA-001153> <Forcibly releasing inactive/harvested connection "weblogic.jdbc.wrapper.PoolConnection_com_microsoft_sqlserver_jdbc_SQLServerConnection@238607" back into the data source connec
tion pool "MASTERDB", currently reserved by: reclaimed because of init failure before user access. Not because of inactivity..>
在我看来,连接上的交易从未结束。但是调用了回滚,我认为这会结束事务。现在,当 Weblogic 下次尝试返回连接时,它会在初始化时出错。关于问题是什么的任何想法?最后我们没有明确地将自动提交设置回true,这可能是问题吗?