你只需要獲取要監控的datasource,就能通過c3p0提供的 com.mchange.v2.c3p0.PooledDataSource接口實現類來完成狀態的查詢。
官方的doc中提供瞭如何獲取狀態的例子代碼:
1. DataSource ds = (DataSource) ictx.lookup( "java:comp/env/jdbc/myDataSource" );
2. // make sure it's a c3p0 PooledDataSource
3. if ( ds instanceof PooledDataSource) {
4. PooledDataSource pds = (PooledDataSource) ds; System.err.println("num_connections: " + pds.getNumConnectionsDefaultUser());
5. System.err.println("num_busy_connections: " + pds.getNumBusyConnectionsDefaultUser()); System.err.println("num_idle_connections: " + pds.getNumIdleConnectionsDefaultUser()); System.err.println(); } else System.err.println("Not a c3p0 PooledDataSource!");
從上邊的代碼中可以看出,只要獲取了系統的datasource應用就可以知道當前連接池的狀態了。
對於單個數據源的系統來說,這種方式顯然是很奏效的。
但是同時我們可能面臨在一個JVM上有多個C3P0數據庫連接池。這個時候我們該如何處理呢?如果我們只是統計整體的一個狀態,那也無需擔心,但是如果我們需要對每個創建的連接池進行統計,那麼就需要我們給每個C3P0連接池打上記號了。這裏官方文檔說可以給每個datasouce指定 dataSourceName,將來根據dataSourceName來指定我們到底要查詢的是哪個數據庫連接池的狀態。詳細參見“Using C3P0Registry to get a reference to a DataSource”,這裏反覆強調了各個連接池的唯一性可以通過dataSourceName來標記。
我們在編碼上記住,通過指定唯一性標記來完成對C3P0連接池的辨認。以此來完成C3P0多數據源的狀態統計