我正在嘗試使用名爲getdbPoolStatistics()的函數來獲取dbpool細節,該函數返回我要監視的所有矩陣的哈希映射。 在getdbPoolStatistics()中,我使用C3P0Registry.getPooledDataSources(),它返回2數據庫池,然後使用迭代器(即connectionIterator)訪問這些池。C3P0Registry mbean未在MBeanServer中註冊。獲取InstanceNotFoundException
獲取令牌,在進行ObjectName創建時會使用該令牌。
ArrayList<String> pooledDataSourcesIdentityTokenList = new ArrayList<String>();
mbean,給你監測信息。
Iterator<PooledDataSource> connectionIterator = C3P0Registry.getPooledDataSources().iterator();
獲取令牌並將其添加到ArrayList。
while(connectionIterator.hasNext()) {
pooledDataSourcesIdentityTokenList.add(connectionIterator.next().getIdentityToken());
}
這一點,我們需要得到的MBeanServer
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
雖然註冊的MBean,我已經使用域後:com.mchange.v2.c3p0,鍵值:類型= PooledDataSource和identityToken =我爲來自C3P0Registry的2數據庫池對象添加了ArrayList的標記。現在
,如果我註冊使用mbs.registerMBean()
for (int i = 0; i < pooledDataSourcesIdentityTokenList.size() ; i++) {
ObjectName objName = new ObjectName("com.mchange.v2.c3p0:type=PooledDataSource,identityToken="+pooledDataSourcesIdentityTokenList.get(i)+",*");
mbs.registerMBean(connectionIterator2.next(), objName.getInstance("com.mchange.v2.c3p0","identityToken",pooledDataSourcesIdentityTokenList.get(i)));
}
的對象名,我得到
:error: unreported exception InstanceAlreadyExistsException; must be caught or declared to be thrown
現在,如果我使用的,而不是遍歷它的完整的對象。
for (int i = 0; i < pooledDataSourcesIdentityTokenList.size() ; i++) {
ObjectName objName = new ObjectName("com.mchange.v2.c3p0:type=PooledDataSource,identityToken="+pooledDataSourcesIdentityTokenList.get(i)+",*");
mbs.registerMBean(C3P0Registry.getPooledDataSources() , objName);
startTimeMillisArray[i] = (String)(mbs.getAttribute(objName, "startTimeMillisDefaultUser"));
}
我得到:
error: unreported exception InstanceAlreadyExistsException; must be caught or declared to be thrown mbs.registerMBean(C3P0Registry.getPooledDataSources() , objName);
由於InstanceAlreadyExistsException異常,我想沒有註冊的MBean 的另外我發現,registerMBean(),是不是在很多例子中使用所以我刪除該行的代碼並嘗試過。
如果我只保持使對象名,然後嘗試的getAttribute並把它放在startTimeMillisArray
for (int i = 0; (i < pooledDataSourcesIdentityTokenList.size() ; i++) {
ObjectName objName = new ObjectName("com.mchange.v2.c3p0:type=PooledDataSource,identityToken="+pooledDataSourcesIdentityTokenList.get(i)+",*");
//No registering mbean here.
startTimeMillisArray[i] = (String)(mbs.getAttribute(objName, "startTimeMillisDefaultUser"));
}
然後我得到的錯誤:
javax.management.InstanceNotFoundException: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=2ufaha9lm5mbruczledo|86ffe7,*
javax.management.InstanceNotFoundException: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=2ufaha9lm5mbruczledo|c7dca5,*
這是創造了很多混淆是否使用registerMBean()或者如果我正確地使用它?請幫忙。
確實,c3p0已經註冊了mbeans。謝謝:) – Falcon34
我很高興它爲你工作! –