jTDS 提交语句在 MSSQL 2008 中关闭未结束事务
Posted
技术标签:
【中文标题】jTDS 提交语句在 MSSQL 2008 中关闭未结束事务【英文标题】:jTDS Commit Statement Close not ending transaction in MSSQL 2008 【发布时间】:2018-09-06 14:02:41 【问题描述】:我们正在使用 jTDS 连接器 (v1.3.1) 和 Hibernate 3 连接到 MSSQL Server 2008+ 数据库(不能更改任何版本)。正常连接工作正常,交易过程没有问题。但是,我们看到数据库上的事务数不胜数,处于休眠/等待命令状态。使用 SQL Profiler 后,我们能够将其追踪到代码的几个区域,在这些区域中,我们在对数据进行批量处理时保持数据库连接打开,并且仅在关闭 PreparedStatements/Statements 时提交事务。基本上我们在数据库上看到的就是我们最后的交易:
IF @@TRANCOUNT > 0 COMMIT TRAN
这意味着连接正在提交但从未完成,因此它保持在睡眠状态。我们的代码示例:
Connection conn = ... //Open the connection object
conn.setAutoCommit(false);
while (true)
PreparedStatement ps = null;
try
ps = conn.prepareStatement("insert into dbtable (column1,column2) values ('data1','data2'); //Opens a new transaction
ps.executeUpdate();
conn.commit();
catch(SQLException ex)
log.error(ex);
finally
DatabaseUtil.close(ps);
以上只是一个示例,但基本上每个准备好的语句都会启动一个新事务,并且基本上在每个新语句处保持打开状态。事务保持睡眠状态,直到连接关闭。
问题: 事务是否应该在准备好的语句的提交/关闭时结束? 要么 这是正常行为吗?我们每次都需要关闭连接对象吗?
【问题讨论】:
【参考方案1】:如果您打算重复使用它,保持连接打开并没有错。只要确保,就像你正在做的那样,在调用之间提交或回滚任何事务
【讨论】:
以上是关于jTDS 提交语句在 MSSQL 2008 中关闭未结束事务的主要内容,如果未能解决你的问题,请参考以下文章