2017-04-17 91 views
0

我们有一个系统,其中许多设备(appservers,多画面等)连接到位于一个应用服务器日志事件Postgres数据库,我们一直在使用C3P0与Hibernate进行几年来管理连接池。休眠/ C3P0连接池的最大尺寸是不尊重

然而,随着系统的发展,每秒数百事件有时可以通过单个设备记录的,我们已经注意到,一段时间后,我们看到了一些设备超过其最大连接数。例如,我们可以有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 

我们的代码过于庞大(坦率地说,又老又丑)对我来说,每一个相关部分在这里复制粘贴但我会尽我所能根据需要提供片段以推进讨论。现在我正在寻找一个开始的地方。谢谢!

+0

这种情况是相当复杂的,难以明确并简要解释的问题。如果我的描述不清楚或缺乏重要细节,我很抱歉。如果您认为我应该添加任何信息让我知道,我会尽我所能提供。 – mllec

+1

c3p0'close()'通过其内部线程池异步连接。默认情况下,该池很小,可能对您的应用程序来说太小。如果线程池积压,你可能会有很多从c3p0的角度来看逻辑关闭的连接,但物理上仍然打开,等待异步接近实际发生。尝试添加像'hibernate.c3p0.numHelperThreads = 15',看看是否有帮助。 –

+0

@SteveWaldman现在这个设置被设置为5,我会尝试增加它。谢谢! – mllec

回答

0

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