是否应在长时间交易中的每次查询后关闭连接?

时间:2016-01-31 10:25:51

标签: 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 = 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可以在我与服务交互时使用该连接吗?我的猜测是我应该,但这会不会影响我的交易?

4 个答案:

答案 0 :(得分:1)

在许多情况下:是的,关闭并重新打开连接听起来不错。但是,您需要了解在两个单独的事务中执行它们的含义(通过关闭并重新打开您在单独事务中固有地执行它们的连接)。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

不应保持数据库连接处于打开状态。当您需要执行查询并尽早关闭它时,打开连接。所以我的解决方案是

答案 3 :(得分:0)

如果您的应用程序没有正确关闭连接可能会导致一些问题,例如 连接池最大化。

应用程序未正确关闭连接:

在编写应用程序以使用 WebSphere Application Server (WAS) 数据源时,最好的方法是使用 get/use/close 模式。

1.get

-这是应用程序发出请求以从池中获取连接的时间。

应用程序将首先查找数据源名称,然后执行 getConnection() 调用。

2.use

-这是应用程序执行查询并等待响应的时间

3.close

-这是应用程序从数据库收到响应并使用该连接完成的最后阶段。

-应用程序应在 finally 块中调用 close() 以关闭连接并将其返回到空闲池。

如果您的应用程序不遵循此模式,您可能会看到连接长时间保持打开状态。这在应用程序未正确关闭连接时尤为明显。 从数据库收到响应后,应用程序应该在 finally 块中调用 close。如果应用程序没有明确关闭连接,该连接将在 WAS 中永远保持打开状态,直到该服务器重新启动。这称为连接泄漏。要解决此类问题,您必须修改您的应用程序以关闭每个连接

更多信息:https://www.ibm.com/support/pages/common-reasons-why-connections-stay-open-long-period-time-websphere-application-server