【问题标题】:Does Db connection pool for standalone Java multi threaded application make sense?独立 Java 多线程应用程序的 Db 连接池是否有意义?
【发布时间】:2016-07-07 12:50:54
【问题描述】:

我已经解决了这些问题 - choose a db connection poolIs DB connection pooling all that importantjava - DataSource for standalone application - no application server

这些并没有回答我的好奇心。

我拥有的是一个独立的多线程 Java 应用程序,它应该在关闭或低负载窗口中向 DB 执行数据加载,但必须足够快才能在有限的时间内完成。

Java 线程的数量是可配置的,但有最大数量的限制。

就数据库连接而言,我目前正在为每个线程获取一个新连接,并在该线程完成后将其关闭。我不使用第三方数据库连接池的原因是,

1.Java线程的最大数量被限制在固定的限制,这个限制是由DB(它的DB2数据库)管理的

2.避免不必要的等待来自数据库池的连接,并避免多个线程之间的冲突或等待时间(以防池中没有连接 是免费的)

所以在我的场景中,是否真的需要数据库连接池,或者从长远来看我会面临任何挑战,或者这只是一个很好的功能?

连接池对于 Web 应用程序很有意义,因为您事先不知道请求/线程的数量,但我不确定对于具有固定最大线程数的独立应用程序是否有任何优势。

如果需要,我正在考虑使用 C3P0 连接池。

【问题讨论】:

标签: java jdbc database-connection


【解决方案1】:

一般来说,连接池会减少建立与数据库的连接的时间,因为它重用连接,即不是打开和关闭连接,而是打开多个连接并管理这些连接(例如,在特定时间后关闭连接)时间,总是有一个可用的连接池,...)。

也就是说,我不确定您的应用程序是否会从连接池中受益(也许您想对其进行基准测试)。如果您有一个具有固定数量线程的独立应用程序,则应用程序的性能可能会受益于连接池,例如,如果可以重用连接。这意味着,如果您的应用程序从一开始就启动所有线程并完成每个计算并关闭连接,那么连接池可能无济于事。但是如果线程是随机启动和关闭的,那可能会有好处。

关于要使用的连接池实现,我个人使用了 C3P0 和 HikariCP (https://brettwooldridge.github.io/HikariCP/)。我强烈推荐后者——但这只是个人意见。

【讨论】:

  • 感谢您指出连接打开和关闭时间。所有应用程序线程都是从一开始就启动的,一旦我们最终确定了目标机器的最佳线程数,线程数也会或多或少地变得固定。
【解决方案2】:

使用连接池比不使用连接池有一些优势;

  1. 在线程启动时,如果连接在池中可用,则线程不会在启动时阻止打开新连接。
  2. 当您的一个线程完成时,可以将连接返回到池中,这样可以减少数据库服务器上的负载,因为客户端连接持续存在(通过应用程序执行);而不是多次设置和拆除

只需限制池中的最大连接数以匹配您提到的数据库限制,并确保您将连接返回池(使用 c3p0 我相信您只是 closeConnection,由他们的 @987654323 包裹@)。

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多