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 中关闭未结束事务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mariadb 中关闭自动提交?

如何配置在 Spring + JDBC 中关闭自动提交?

JTDS (Java/MSSQL) - 找不到存储过程

如何阻止用户在 Javascript 中关闭窗口?

如何从 try-with-resource 语句中关闭资源

如何在 VC++ 项目中关闭 Unicode?