c3p0数据源依赖着一个池,它包括了ComboPooledDataSource的实现和DataSources.pooledDataSource( … ) 方法返回的对象以及com.mchange.v2.c3p0.PooledDataSource 接口的所有实现,这使得有大量查询数据源连接池状态的方法可用。
下面有一段查询数据源状态的示例代码:[code]// fetch a JNDI-bound DataSource
InitialContext ictx = new InitialContext();
DataSource ds = (DataSource) ictx.lookup( “java:comp/env/jdbc/myDataSource” );
// make sure it’s a c3p0 PooledDataSource
if ( ds instanceof PooledDataSource)
{
PooledDataSource pds = (PooledDataSource) ds;
System.err.println("num_connections: " + pds.getNumConnectionsDefaultUser());
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!”);[/code]这些状态查询方法有三种重载方式,比如:
[list]
[]public int getNumConnectionsDefaultUser()
[]public int getNumConnections(String username, String password)
[*]public int getNumConnectionsAllUsers()
[/list]
c3p0为不同认证信息的连接维护着不同的连接池。这些方法能够让你逐个地查询这些连接池的状态,或者统计出数据源所维护的所有连接池的状态。
请注意连接池配置参数,比如 maxPoolSize 是对于每个认证信息来设定的!举个例子,比如你设定了maxPoolSize的值为20,如果数据源管理的连接在两套用户名-密码之下[一套默认的,和另外一套通过调用 getConnection(user, password)方法建立的],你应该要知道 getNumConnectionsAllUsers() 会返回 40。
大多数的应用只从数据源中获取默认认证信息的数据库连接,并且通常可以使用getXXXDefaultUser() 来统计所有的连接。
与统计跟连接池有关的状态一样,你也可以获取每个数据源的线程池的状态信息。请参阅池化数据源的可用操作的完整列表。
使用C3P0Registry来获得数据源的引用
如果不方便或不可能通过JNDI或其他方法获得数据源的引用的话,你可以通过使用 C3P0Registry 类来找到所有可用的数据源。这个类通过三个静态方法来帮助你摆脱困境:
[list]
[]public static Set getPooledDataSources()
[]public static Set pooledDataSourcesByName(String dataSourceName)
[*]public static PooledDataSource pooledDataSourceByName(String dataSourceName)
[/list]
第一个方法将会返回给你所有的可用的c3p0 PooledDataSources。如果你确定你的应用只会创建一个PooledDataSources,或者你可以通过配置信息(用“getters”检测)来区分数据源的话,第一个方法对你来说足矣。因为情况并不总是这样,c3p0 PooledDataSources有一个特殊性属性,名字为 dataSourceName。
你可以在构造数据源对象时直接设定这个属性,也可以像其他属性那样通过一个命名配置或默认配置来设置。不然的话,dataSourceName属性的默认值是这样生成的:
1)如果你使用了一个命名配置来构造数据源,dataSourceName的值就是这个命名配置的名称;或者,
2)如果你使用了默认的配置,dataSourceName会是一个唯一(但是变幻莫测并且不可确保唯一性)的值。
无法保证dataSourceName的值是唯一的。比如,如果两个c3p0数据源共用同一个命名配置,并且你没有编程式地设定dataSourceName的值,那么这两个数据源的dataSourceName就会相同,即这个命名配置的名称。使用pooledDataSourcesByName(„)方法可以得到特定的 dataSourceName 的所有数据源。
如果你确保你的数据源的名称是唯一的(这通常是你想要的,如果你打算用C3P0Registry来找到你的数据源的话),你可以使用pooledDataSourceByName()这个更方便的方法来直接得到你需要的数据源(或者当找不到对应的数据源时返回null)。
如果你使用pooledDataSourceByName(„),但是数据源名不唯一的话,返回哪个数据源对象是不确定的。
REF:
http://cwiki.ossez.com/pages/viewpage.action?pageId=4719793