Hibernate/C3P0 不遵守连接池最大大小

Hibernate/C3P0 connection pool max size is not respected

我们有一个系统,其中许多设备(应用程序服务器、多视图器等)连接到位于一个应用程序服务器上的 Postgres 数据库以记录事件,我们多年来一直使用 C3P0 和 Hibernate 来管理连接池。

然而,随着系统的增长,有时单个设备每秒可以记录数百个事件,我们注意到一段时间后我们看到一些设备超过了它们的最大连接数。例如,我们可以有 hibernate.c3p0.max_size=40,并且仍然可以看到多达一百个连接。

min_sizetimeout 等其他设置在同一个文件中以相同的方式设置,我们看到它们按应有的方式生效,所以我很确定问题不在于如何配置已定义。

我已经进行了 2 周的研究并试图解决此问题。在某些时候,我怀疑每个线程获得自己的 Hibernate 会话的方式有问题,并且不知何故可能会导致为每个线程打开一个新的连接池而不是重用同一个池,但我阅读了 C3P0 的源代码和似乎池真的是由 username/password 管理的,而不是由会话管理的,而且我们对每个会话都使用相同的 username/password,所以现在我很困惑并且 运行 没有想法。

以下是一些配置,以备不时之需:

hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.username=***
hibernate.connection.password=***
hibernate.connection.url=jdbc:postgresql://localhost/eventlog

hibernate.c3p0.min_size=10
hibernate.c3p0.max_size=40
hibernate.c3p0.acquire_increment=10
hibernate.c3p0.max_statements=200
hibernate.c3p0.timeout=3600
hibernate.c3p0.idle_test_period=1800

我们的代码太大(坦率地说,又旧又丑),我无法在此处复制粘贴每个相关部分,但我会尽力提供推进讨论所需的片段。现在我正在寻找一个起点。谢谢!

@SteveWaldman 的评论就是答案。我在使用太多连接的设备上将 c3p0.numHelperThreads 设置的值从 5 增加到 20,现在一切都 运行 顺利。谢谢!