java - 连接池是否有利于多线程 Java 程序

标签 java multithreading jdbc pool

我有一个启动大约 60 个线程的 java 进程,每个线程访问一个 MySql 数据库。

我会从使用像 C3P0 这样的连接池中受益吗?或者它仅适用于 Web 应用程序(可扩展到大量用户)?

今天我们有长期存在的 JDBC 连接(每个线程一个),我的计划是在每次 SQL 查询/插入之前从连接池中获取一个连接。

我想知道这是否会使我们的应用程序更稳定?另外,如果我将它配置为匹配数据库中的最大连接数,线程是否必须等待直到有空闲连接?文档不是很清楚(至少对我来说不是)。

感谢任何指导!

最佳答案

您可能可以从连接池中获益。 “通信链接失败”以及长期存在的 JDBC 连接让我怀疑连接在一段时间未使用(空闲)后断开。

HikariCP这样的数据库连接池为您做两件事可以帮助您:

  • 在分发之前检查连接是否有效。如果无效,则将其丢弃,并分发另一个有效的连接或新连接。这一切都由池完成,您的应用程序无需处理。
  • 通过关闭空闲连接(“idleTimeout”)和循环长期连接(“maxLifetime”)来保持连接健康。当不良网络组件(防火墙)断开任何打开时间超过 30 分钟的连接时,后者特别有用。(*)

如果使用池中的所有连接,则线程可能必须等待(“connectionTimeout”)。但是如果你的池有一个适当的最大大小(“maximumPoolSize”),这很少会很长时间。它确实要求您的应用程序尽量减少它使用连接的时间:在获取连接和关闭它(将连接返回到池)之间,您的应用程序应该主要/只执行数据库操作。一个副作用是您将需要更少的连接:您现在使用 60 个,您可能会发现池中只需要 6 个。需要进行一些性能测试以确定适合您的应用程序的“maximumPoolSize”。

我建议您尝试使用和不使用连接池的“拔出”测试。运行您的应用程序并让它做一些事情,拔下网络电缆,然后重新插入网络电缆,看看您的应用程序需要多长时间才能恢复。在池情况下,一旦池能够创建到数据库的新连接,您应该会看到您的应用程序再次正常运行。

(*) 循环连接还有另一个原因:一些查询可能会在数据库服务器端产生临时数据,而数据库服务器可能会在连接处于 Activity 状态时一直保留这些数据。这可能会导致数据库服务器的内存使用量不断增加。我没有看到这种情况发生,但我知道其他人看到了。在这种情况下,“maxLifetime”选项非常有用。

关于java - 连接池是否有利于多线程 Java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27318792/

相关文章:

java - 在java中添加和删除trayicon?

java - 如何在 Android 中单击一个按钮运行长代码而不导致应用程序崩溃?

java - 在 Spring 中一起配置 JDBC 和 Hibernate

java - jdbc insert using batch 获取成功插入的行数

mysql - "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure"

java - 使用 apache Camel 执行路由关闭逻辑

java - 在覆盖 toString 时,是使用 getter 方法更好还是直接访问私有(private)字段更好?

java - Netbeans 找不到合适的数据库

c - 多线程访问树中的数据

C:多线程