我正在尝试使用名为 getdbPoolStatistics() 的函数获取 dbpool 详细信息,该函数返回我要监控的所有指标的哈希图。在 getdbPoolStatistics() 中,我使用 C3P0Registry.getPooledDataSources() 返回2 个数据库池,然后使用迭代器(即 connectionIterator)访问池。
获取 token ,在 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 时,我使用了 Domain: com.mchange.v2.c3p0, key-value: type=PooledDataSource 和 identityToken= 我为来自 C3P0Registry 的 2 个 db 池对象添加到 ArrayList 的令牌。
现在,如果我使用 mbs.registerMBean() 注册 ObjectName
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() 在很多示例中都没有使用,所以我删除了那行代码并尝试了。
如果我只保留 ObjectName 然后尝试 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() 以及我是否以正确的方式使用它,这都会造成很多混乱?请帮忙。