当前位置: 首页 > 知识库问答 >
问题:

使用什么来确保连接池始终被关闭?

彭宜人
2023-03-14

我明白终结器是不好用的,即使用于连接关闭(是否在finalize最佳实践中关闭连接?),因为它们不能保证被调用。但是如果您的连接是通过连接池进行池化的呢?在我的例子中,我使用Apache Commons pool(http://Commons.Apache.org/proper/commons-pool/)来池化SFTP连接。我不能使用try-with-resources技术,因为每个连接不应该在每次尝试结束时关闭(以便池可以在下一个操作中潜在地重用它)。

我确实提供了一个调用pool.close()的closePool()方法,这样任何使用我的代码的程序员都可以调用它,但是如果她/他忘记这样做了呢?从终结器调用此方法是尝试关闭连接池以避免手动操作的最佳解决方案吗?还是有更好的方法?关机钩能更好地工作吗?

共有1个答案

吕承福
2023-03-14

如果您正在编写一个向其他人提供此功能的库,那么除了提供closepool()方法之外,我不知道您还能做什么。您也许可以让您的类从java.io.closeable和/或autocloseable继承,但是除了需要清理您的资源之外,您还必须依靠开发人员使用您的代码来完成正确的工作。

如果没有正确实现,库代码中的意外终结器可能是一件令人讨厌的事情。

您可以尝试添加一个关机钩子,但是如果JVM无论如何都在关机,那么在这一点上强制关闭连接池就没有什么意义了。

 类似资料:
  • 我正在使用HikariDataSource连接到MariaDB数据库。以下类返回一个。 这是执行select查询的方法。该类还包含一个close方法 try with块自动关闭对象,但如何关闭连接池?例如,我应该在数据库操作之后调用close方法吗 当我不调用方法时,我看不到任何关于关机启动的控制台输出。这是关闭和连接池的正确方法吗?

  • 问题内容: 与 那两个工作正常。 使用连接池背后的想法是什么?什么时候使用? 问题答案: 从redis-py docs: 在后台,redis- py使用连接池来管理与Redis服务器的连接。默认情况下,您创建的每个Redis实例将依次创建自己的连接池。通过将已创建的连接池实例传递给Redis类的connection_pool参数,可以覆盖此行为并使用现有的连接池。您可以选择执行此操作,以实现客户端

  • 问题内容: 我正在尝试使用H2OR内的库在具有7000万行和25个数字特征的训练集上使用随机森林分类模型。总文件大小为5.6 GB。 验证文件的大小为1 GB。 我的系统上有16 GB RAM和8核CPU。 系统成功读取了H2O对象中的两个文件。 然后,我给出以下命令来构建模型: 但是几分钟(不生成任何树)后,出现以下错误: “ .h2o.doSafeREST中的错误(conn = conn,h2

  • 问题内容: 我经常使用看起来像这样的模式。我想知道这是否还行,或者是否有我没有在此处应用的最佳实践。 我特别想知道;在引发异常的情况下,我在finally块中具有的代码是否足以确保正确关闭连接? 问题答案: 将您的数据库处理代码包装在“使用”中

  • 当我使用CloseableHttpClient和do Execute方法时,它在第一次正常工作,但之后从未成功。它将引发表示“连接池关闭”的异常 有人说是因为我还没有关闭客户端有人说是httpClient 4.3中的bug 我的项目不存在上述问题,但仍然无法正常工作

  • 我正在Java中运行Apache HTTP POST请求,每当我超过1300个请求时,就会出现以下错误,我需要发出更多的请求,大约40k,我可以做些什么来纠正相同的错误?