不尊重Hibernate / C3P0连接池最大大小

时间:2017-04-17 19:51:38

标签: hibernate connection-pooling c3p0

我们有一个系统,许多设备(appservers,multiviewers等)连接到位于一个appserver上的Postgres数据库来记录事件,我们多年来一直使用C3P0和Hibernate来管理连接池。

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

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

我一直在做研究并试图解决这个问题2个星期了。在某些时候,我怀疑每个线程获得自己的Hibernate会话的方式有问题,并且可能会导致为每个线程打开一个新的连接池而不是重用相同的池,但我读了C3P0的源代码,看起来这些池真的是由用户名/密码管理,而不是由会话管理,我们在每个会话中使用相同的用户名/密码,所以现在我很困惑并且没有想法。

以下是一些可以提供任何帮助的配置:

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

我们的代码太大了(而且非常坦率,陈旧和丑陋)让我在这里复制粘贴每个相关部分但我会尽力提供必要的片段来推进讨论。现在我正在寻找一个可以开始的地方。谢谢!

1 个答案:

答案 0 :(得分:0)

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