我们目前正在处理该功能,该功能必须部分地与数据库一起工作,并且部分地与服务一起工作,这些操作非常耗时。所以,一般来说,这是一个事务方法,它有一个像这样的代码:
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可以在我与服务交互时使用该连接吗?我的猜测是我应该,但这会不会影响我的交易?
答案 0 :(得分:1)
在许多情况下:是的,关闭并重新打开连接听起来不错。但是,您需要了解在两个单独的事务中执行它们的含义(通过关闭并重新打开您在单独事务中固有地执行它们的连接)。
如果另一个用户调用在B点更改数据状态的操作,最终结果是否仍然正确?
答案 1 :(得分:0)
如果您没有交易,可以关闭连接并在需要时请求新连接。
请记住,如果您正在使用连接池关闭连接,则不会真正关闭连接,只会将其标记为可由其他线程重复使用。
答案 2 :(得分:0)
不应保持数据库连接处于打开状态。当您需要执行查询并尽早关闭它时,打开连接。所以我的解决方案是是。
答案 3 :(得分:0)
如果您的应用程序没有正确关闭连接可能会导致一些问题,例如 连接池最大化。
应用程序未正确关闭连接:
在编写应用程序以使用 WebSphere Application Server (WAS) 数据源时,最好的方法是使用 get/use/close 模式。
-这是应用程序发出请求以从池中获取连接的时间。
应用程序将首先查找数据源名称,然后执行 getConnection()
调用。
-这是应用程序执行查询并等待响应的时间
-这是应用程序从数据库收到响应并使用该连接完成的最后阶段。
-应用程序应在 finally 块中调用 close()
以关闭连接并将其返回到空闲池。
如果您的应用程序不遵循此模式,您可能会看到连接长时间保持打开状态。这在应用程序未正确关闭连接时尤为明显。 从数据库收到响应后,应用程序应该在 finally 块中调用 close。如果应用程序没有明确关闭连接,该连接将在 WAS 中永远保持打开状态,直到该服务器重新启动。这称为连接泄漏。要解决此类问题,您必须修改您的应用程序以关闭每个连接