2017-04-17 89 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,現在一切都運行平穩。謝謝!