是否有资源(连接)池在不需要时自动返回借用的资源(连接)?

时间:2021-06-13 21:38:13

标签: java jdbc threadpool connection-pooling pool

是否有资源(连接)池在不需要时自动将借用的资源(连接)?

我经常遇到 Java 软件 由于未返回(关闭)池连接而导致错误。主要由外部供应商构建,我提供长期维护服务。我希望池自动返回连接 如果它在指定的时间(秒)内空闲(未使用)。 只要连接被同一个线程使用,它就应该保持分配状态 到该线程,但如果该线程自上次调用完成后超过几 (5) 秒未使用该连接, 连接应该会自动返回到池中。

我已经在带有商业 RDBMS 的商业 Web 服务器上完成了原型 并且在我们的生产中表现出色。 由于池化连接粘在线程上 并且 Web 服务器已经使用线程池, 不同线程之间的连接切换最少。 因此,性能优于使用传统借入和归还方法时, 因为一旦连接被线程借用,它通常 分配给同一个线程很长一段时间, 因为它经常被使用。

除了 JDBC 连接外,这种方法效果很好 对于其他大量池化资源,例如 JSON 解析器, HTTP 连接或日期格式化程序。如果池中与服务器上并行线程的连接较少,则没有太大价值,因为您将无法运行那么多 线程无论如何都是并行的,因为没有足够的连接。 那么为什么没有与并行线程一样多的连接呢。

一些现有的池可以在一段时间不活动后释放连接, 但是不释放其连接的 servlet, 会很快耗尽所有可用的连接, 如果它遇到正确的条件并获得大量请求。有了新的线程粘性连接,情况并非如此, 作为不释放连接的线程, 借用时再次获得相同的连接。

我的问题,主要原因是什么 不要使用这种方法,因为我发现它在服务器上的表现要好得多 重用线程并维护线程池。

1 个答案:

答案 0 :(得分:0)

<块引用>

我经常遇到由于未返回(关闭)池连接而导致 Java 软件出现错误的情况。

这是您自己的应用程序代码访问数据库的问题,而不是您的连接池的问题。

? 每个客户端应用程序负责关闭 JDBC 数据库连接。

Java 上的 try-with-resources 语法就是为了简化这一过程而发明的。如果资源实现了 AutoCloseable 接口,您可以在括号内列出资源。此类类包括 java.sql.ConnectionStatementResultSet 等。

DataSource dataSource = … 
…
try
(
   Connection conn = dataSource.getConnection() ;
)
{
    … use your database connection 
}
// At this point your database connection has been closed, whether having completed its work successfully or whether an exception was thrown. 
// If the connection came from a pool, the connection will actually be returned to the pool rather than actually closed, per policies of that particular pool implementation.

你问:

<块引用>

如果自上次调用完成以来线程未使用连接超过几 (5) 秒,则连接应自动返回到池中。

这是不明智的。您只是将墙纸放在墙上的一个洞上,掩盖了真正的问题而不是解决它。如上所示,您应该自动关闭连接。然后调查并解决任何代码挂起和未返回连接的情况。使用您的方法,您将忽略此类错误。然后任何暂时延迟的代码可能会继续使用其他代码正在使用的连接。


顺便说一下,对于 Stack Overflow 来说,寻求软件推荐显然是题外话。为此,请参阅姊妹网站 Software Recommendations Stack Exchange