我们使用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);
}
}
以上只是一个示例,但基本上每个预准备语句都会启动一个新事务,并且基本上在每个新语句中保持打开状态。在连接关闭之前,事务将保持睡眠状态。
问题: 交易应该在准备好的声明的提交/结束时结束吗? 要么 这是正常行为,我们每次都需要关闭连接对象吗?
答案 0 :(得分:0)
如果您计划重复使用,那么保持连接打开并没有错。只需确保,就像您正在做的那样,提交或回滚调用之间的任何事务