簡體   English   中英

Hibernate - C3P0 JDBC 連接池

[英]Hibernate - C3P0 JDBC connection pooling

我不是 Java 開發人員,而是系統管理員,請原諒我的任何毫無意義的陳述或問題。

我懷疑 C3P0 連接池在 Hibernate 中設置不正確,導致大量 Oracle DB 連接( oracle<instanceID> (LOCAL-NO) )通過各種 ZD52387880E1EA22817A72D3759999999 應用程序。 其中一些連接會保持 30 天(可能是陳舊的),直到它們被自動關閉或丟棄。 這些連接 go 到“睡眠(S)” state 並且進程堆棧在“sk_wait_data”階段顯示它們。 他們中的大多數似乎確實在嘗試尋找數據並將 go 切換回“sk_wait_data”。 切換每隔幾秒鍾發生一次。 該開關使進程進入 CPU 運行隊列,從而導致系統負載值增加。 我相信這是一個非常關鍵的系統資源問題。

根據 JMC,最小池大小為 1,最大值取決於應用程序的類型。 我懷疑min=1是完全錯誤的,應該根據應用程序流量的可持續性和一些可擴展性緩沖區正確設置最大值。 在 JMC 中,C3P0 池的使用似乎不穩定且效率低下。

所以連接狀態的切換是不好的,需要修復。 除了尋求上述專家的意見外,我還有一個關於數據庫連接的問題:

JDBC 連接會像上面那樣來回移動“sk_wait_data”還是錯了?

我認為最小大小的池連接將始終連接到數據庫,但不知道他們的套接字連接 state 是什么?

同樣在具有 2 個 Java 應用程序的 VM 上,它們似乎創建了 10 個池。 也不確定這是否正確。

請指教。

1-“連接停留 30 天”:

設置:maxConnectionAge 為合理值:我通常將其設置為 18000 秒(5 小時),這將確保在此時間之后無論如何都會刷新連接。

2- “他們中的大多數似乎確實在嘗試尋找數據並將 go 切換回“sk_wait_data”

很可能這是驅動程序特定的行為,我建議設置:idleConnectionTestPeriod,我通常將其設置為 60 秒,這將每 60 秒對空閑連接執行一次測試查詢。

3- “我懷疑 min=1 是完全錯誤的”

這個值是根據很多因素決定的,比如連接到數據庫的應用程序的數量、持續的活動負載和平均負載,最重要的是並發負載。

我建議根據每秒平均並發負載進行設置。

4- “JDBC 連接會像上面那樣來回移動“sk_wait_data”還是錯了?”

檢查點 1 和點 2,此外,c3p0 提供了“testConnectionOnCheckout”和“testConnectionOnCheckin”屬性,這也確保了連接是有效的。

5- “我認為最小大小的池連接將始終連接到數據庫,但不知道他們的套接字連接 state 是什么?”

這純粹基於驅動程序的實現,但是,對於第 4 點,您很可能不需要關心它。

6- “具有 2 個 Java 應用程序的虛擬機,它們似乎創建了 10 個池。不確定這是否正確。”

連接池是根據 hibernate SessionFactory(在休眠的情況下)創建的,這很可能是每個應用程序一個(桌面應用程序上每個 JVM 一個)和一個 Web 應用程序,如果是 Web 服務器(例如 tomcat)或應用程序服務器(例如Weblogic 或 web 球體)。

但是,如果單個應用程序創建了多個池,則應與應用程序開發人員核實。

c3p0 的完整配置可以在以下位置找到: https://www.mchange.com/projects/c3p0/index.html#configuration_properties

祝你好運
賈拉勒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM