這將是有用的,因爲我想知道池是否用盡之前,我需要在我的DAO中創建從會話的交易。如何使會話打開時從c3p0進行Hibernate SessionFactory檢出JDBC連接?
我想給用戶提供關於系統過載(池耗盡)的反饋,但我不想在每個DAO的每種方法中捕獲這個特定的異常。我認爲會議開幕會是檢查這個問題的正確時機。
這將是有用的,因爲我想知道池是否用盡之前,我需要在我的DAO中創建從會話的交易。如何使會話打開時從c3p0進行Hibernate SessionFactory檢出JDBC連接?
我想給用戶提供關於系統過載(池耗盡)的反饋,但我不想在每個DAO的每種方法中捕獲這個特定的異常。我認爲會議開幕會是檢查這個問題的正確時機。
Hibernate的較新版本的這個數據庫連接屬性:
hibernate.connection.acquisition_mode
可以設置爲立即,從而
「連接將盡快Hibernate的Session是收購 已打開,這也會繞過ConnectionReleaseMode,因爲連接 將被保留,直到會話關閉。「
Hibernate最好儘量使用數據庫連接。在打開會話時聲明數據庫連接與此相反(沒有可執行的查詢,這將在稍後進行)。一個副作用是池會很快耗盡。
c3p0使用checkoutTimeout來確定當池耗盡時等待連接變爲可用的時間。默認情況下,這個超時是0(即沒有超時),但是如果它被設置爲另一個值(例如50 000毫秒)並且達到超時,則拋出SQLException
。
您可以嘗試做出有根據的猜測,看看在開始交易之前是否會達到checkoutTimeout
,但這總是一個猜測:它取決於其他交易完成的速度。
爲了做出猜測,您可以使用c3p0的JMX interface並獲取連接數(NumConnections),繁忙連接數(NumBusyConnections)和等待連接的線程數(NumThreadsAwaitingCheckout)的值。
如果有很多繁忙的連接並且有很多線程正在等待,那麼很有可能會到達checkoutTimeout
,但您必須通過壓力測試確定確切的數字。