jTDS Commit Statement在MSSQL 2008中关闭不结束事务

时间:2018-03-28 02:27:01

标签: sql-server jdbc transactions commit jtds

我们使用jTDS连接器(v1.3.1)和Hibernate 3连接到MSSQL Server 2008+数据库(无法更改任何版本)。正常连接工作正常,事务处理没有问题。但是,我们在sleep / AWAITING COMMAND状态下看到数据库中的无数事务。在使用SQL事件探查器之后,我们能够将其跟踪到我们的代码的一些区域,在这些区域中我们保持数据库连接打开,同时进行数据的批量处理并且仅在关闭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 个答案:

答案 0 :(得分:0)

如果您计划重复使用,那么保持连接打开并没有错。只需确保,就像您正在做的那样,提交或回滚调用之间的任何事务