2015-12-01 70 views
1

我們在下面的配置中使用c3p0作爲Hibernate中的共享庫。我們懷疑這個庫中可能存在內存泄漏。我們轉儲應用程序的內存堆,它顯示「com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache」類型的一個對象使用2.2GB內存(佔所有內存的61.6%),並且它持續增長,直到內存不足。據我瞭解,這個類用於緩存PreparedStatements。我們的配置對此值使用了100,這意味着最多應該緩存100個語句。Hibernate中c3p0可能的內存泄漏?

configuration 
    .setProperty("hibernate.c3p0.max_size", "25") 
    .setProperty("hibernate.c3p0.min_size", "2") 
    .setProperty("hibernate.c3p0.initial_pool_size", "2") 
    .setProperty("hibernate.c3p0.timeout", "3600") 
    .setProperty("hibernate.c3p0.max_statements", "100") 
    .setProperty("hibernate.c3p0.idle_test_period", "300") 
    .setProperty("hibernate.c3p0.acquire_increment", "2") 
    .setProperty("hibernate.c3p0.maxConnectionAge", "3600") 
    .setProperty("hibernate.c3p0.numHelperThreads", "6") 

在此先感謝您的幫助!

+0

嗨。幾個簡單的問題:1)你使用的是什麼版本的c3p0? 2)你可以通過JMX監視你的應用程序嗎? c3p0在那裏報告有關其語句緩存的大量信息,該信息可能會有所幫助; 3)你使用的是什麼dbms/jdbc驅動程序?謝謝! –

回答

0

是的,它確實可能是一個錯誤。我建議報告你的問題here

三提示:

  1. 語句緩存是默認在C3P0禁用。我想你可以猜出爲什麼。
  2. c3p0太容易誤配置。
  3. c3p0是一個(非常)成熟的庫,但不幸的是,它現在還遠未成爲JDBC連接池的最佳選擇。我真的建議你嘗試更快,更可靠的HikariCP

恕我直言,HikariCP也比c3p0更具可預測性和簡單易用性。當然,你也有其他連接池庫:DBCP,Tomcat池,BoneCP,Proxool等。你可以嘗試其中的一些並選擇適合你的應用的庫。

所以基本上你有兩個選擇,關閉c3p0中的jdbc語句緩存並等待修復(或單獨修復它並創建拉取請求)或嘗試一些替代方法。
儘管如此,祝你好運:)

+0

缺省情況下,未啓用該語句緩存是直接脫離使用maxStatements參數配置的透明語句緩存池的JDBC 3規範,無論您可能會提出什麼建議。 –

+0

感謝您的回答!我關心的唯一問題是性能問題。儘管c3p0文檔建議爲緩存用戶分析應用程序。 也感謝您的鏈接。我在這裏發佈了一個問題:https://github.com/swaldman/c3p0/issues/61 –

+0

@SteveWaldman對不起,我不知道。謝謝你的提示。 –