2012-08-05 116 views
0

我有一個使用c3p0作爲連接池的web應用程序。我們使用hibernate作爲orm工具。 最近,我們一直在獲取連接超時異常。爲了調試這些異常,我啓用了C3p0的日誌記錄功能,並在日誌中獲得了一些信息。任何人都可以幫助我完全理解它。連接池C3P0日誌記錄

DEBUG 2012-08-05 14:43:52,590 [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] com.mchange.v2.c3p0.stmt.GooGooStatementCache: checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 2; checked out: 0; num connections: 1; num keys: 2 

從上面我可以觀察到,連接池的總大小是2.檢出的連接數是0.這是正確的嗎?上面的num_connections和num鍵是什麼?

謝謝..

回答

1

你在你所引用的日誌位看到什麼語句緩存的快照,而不是連接池。在消息被記錄時,有兩個緩存的PreparedStatements,屬於單個Connection。這兩份聲明均未被檢出/正在使用。

我希望這有助於!

+0

謝謝史蒂夫...我改變了log4j.properties中的記錄器,現在有一組不同的日誌.. – Npa 2012-08-06 00:46:25

+0

DEBUG 2012-08-05 19:44:02,526 [Timer-2] com.mchange.v2.resourcepool .BasicResourcePool:跟蹤[email protected] [託管:4,未使用:4,排除:0](例如[email protected]) 你能告訴我什麼管理,未使用和排除意味着在這個日誌? – Npa 2012-08-06 00:46:51

+0

「託管」表示池中的連接數量; 「未使用」表示當前未由客戶端檢出並在池中可用的連接數; 「排除」是指檢出的連接,但遇到某種錯誤或錯誤,例如,當客戶端嘗試將它們檢入池中時,c3p0已將其標記爲處置而不是重新納入。 – 2012-08-06 19:52:22

0

例外可能是由於錯誤地定義C3P0設置。確保鏈接到正確的jar文件您的應用程序必須鏈接到「hibernate-c3p0 * .jar」,而不是「c3p0 * .jar」。 hibernate.cfg文件必須定義hibernate.connection.provider_class屬性,以使c3p0設置生效。下面是一個示例設置

<property name="hibernate.connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider </property> 

<property name="hibernate.c3p0.min_size">5</property> 
<property name="hibernate.c3p0.max_size">10</property> 
<property name="hibernate.c3p0.timeout">300</property> 
<property name="hibernate.c3p0.max_statements">50</property> 
<property name="hibernate.c3p0.idle_test_period">3000</property> 

日誌條目指定有在游泳池4個連接,所有的4個連接可供應用程序使用。對數據庫運行查詢以列出所有活動連接將顯示池連接。例如在Mysql中,你可以運行「show processlist;」來查看這些連接。