2016-12-30 169 views
1

我正在嘗試使用名爲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()或者如果我正確地使用它?請幫忙。

回答

0

我認爲你可能會做比你需要的更多的工作。

c3p0默認註冊其MBean。如果你不想讓他們註冊,你必須在那裏工作。如果您在監視c3p0池及其註冊表時遇到問題,則可能需要調試常規JMX內容。您是否在同一個JVM上看到其他MBean?如果不是,您可能需要設置一些系統屬性。有關提示,請參閱here

如果您想在c3p0中關閉JMX註冊,也就是說,如果要禁用JMX MBean註冊,則只需執行任何特殊操作。

您還可以爲您的c3p0 MBeans定製和/或穩定的名稱。

但是,您絕對不應該進入底層的JMX API,比如定義自己的ObjectName對象。 c3p0負責爲你服務。

請參閱c3p0的文檔,here的JMX部分。

p.s. c3p0不包含getdbPoolStatistics()方法,可能是您自己的庫的一部分。

+0

確實,c3p0已經註冊了mbeans。謝謝:) – Falcon34

+0

我很高興它爲你工作! –