Java 在长时间事务中,每次查询后是否应关闭连接?

Java 在长时间事务中,每次查询后是否应关闭连接?,java,jdbc,transactions,connection-pooling,rollback,Java,Jdbc,Transactions,Connection Pooling,Rollback,我们目前正在处理函数,它必须部分与数据库一起工作,部分与服务一起工作,而这些操作非常耗时。所以,一般来说,这里有一个事务方法,它的代码如下: Connection conn = null; try { conn = getConnection(); // This I get from the connection pool Employee emp = queryDatabase(id); // Point A - ?? Response resp = makeLongTim

我们目前正在处理函数,它必须部分与数据库一起工作,部分与服务一起工作,而这些操作非常耗时。所以,一般来说,这里有一个事务方法,它的代码如下:

Connection conn = null;
try {
  conn = getConnection(); // This I get from the connection pool
  Employee emp = queryDatabase(id); 
  // Point A - ??
  Response resp = makeLongTimeServiceCall(emp);
  // Point B - ??
  anotherQueryDatabase(resp);

} catch (Exception e) {
  throw e; // And this also rolls back the transaction
} finally {
  // If conn is not closed, close it, so there would be no leaks
}

所以最大的问题是-我是否应该在点A关闭连接,然后从点B的连接池中再次获取连接,以便其他servlet可以在我与服务交互时使用该连接?我想我应该这样做,但这会影响我的交易吗?

如果您没有交易,您可以关闭连接,并在需要时请求新的连接


请记住,如果使用连接池关闭连接,则不会真正关闭连接,而只会将其标记为可供其他线程重用。

数据库连接不应保持打开状态。在需要执行查询时打开连接,并尽早将其关闭。因此,我的解决方案是,在许多情况下:是的,关闭和重新打开连接听起来不错。但是,您需要理解在两个单独的事务中执行这些操作的含义(通过关闭和重新打开连接,您本质上是在单独的事务中执行这些操作)

如果另一个用户调用一个操作,在B点更改您的数据状态,那么最终结果是否仍然正确?

当我读到这个“长时间事务…”时,我感到很痛苦。