独立 Java 多线程应用程序的 Db 连接池是否有意义?

Does Db connection pool for standalone Java multi threaded application make sense?

我已经解决了这些问题 - choose a db connection pool , Is DB connection pooling all that important and java - DataSource for standalone application - no application server

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

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

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

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

1.Number of maximum Java threads are limited to fixed limit and that limit is manageable by DB ( Its DB2 database )

2.Avoid unnecessary wait for connection from DB pools and avoid clash or wait times among multiple threads ( in case no connections in pool are free )

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

连接池在 Web 应用程序的情况下有意义,因为您事先不知道 requests/threads 的数量,但我不确定具有固定最大线程的独立应用程序是否有任何优势。

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

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

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

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

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

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

简单地限制你的池中的最大连接数以匹配你提到的数据库限制并确保你 return 你的连接池(使用 c3p0 我相信你只是 close Connection, 由 PooledConnection).

包裹