【问题标题】:Should the connection be closed after each query in a long time transaction?是否应该在长时间事务中的每个查询后关闭连接?
【发布时间】:2016-05-08 20:32:15
【问题描述】:

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

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 可以在我与服务交互时使用该连接?我的猜测是我应该这样做,但这会损害我的交易吗?

【问题讨论】:

  • 当我读到这个“长期交易......”时,我很伤心。

标签: java jdbc transactions connection-pooling rollback


【解决方案1】:

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

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

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

1.get

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

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

2.使用

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          • 2020-12-31
          • 2013-08-15
          相关资源
          最近更新 更多