我正试图使用名为getdbPoolStatistics()的函数来获取数据库池的详细信息,该函数返回我要监视的所有度量的哈希图。在getdbPoolStatistics()中,我使用C3P0Registry.getPooledDataSources(),它返回2个数据库池,然后使用迭代器(即connectionIterator)访问这些池。
获取令牌,该令牌将在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,键值:type=PooledDataSource和identityToken=我已添加到ArrayList的令牌,用于C3P0Registry中的2个数据库池对象。
现在,如果我使用mbs.registerBean()注册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此外,我发现registerBean()在很多例子中都没有使用,所以我删除了那行代码并尝试了一下。
如果我只保留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(),以及我是否以正确的方式使用它?请帮忙。
我认为你可能做了比你需要做的多得多的工作。
c3p0默认注册其MBean。如果你不想让他们注册,你必须努力。如果您在监视c3p0池及其注册表时遇到问题,则可能需要调试一般的JMX内容。您是否在同一JVM上看到其他MBean?如果没有,您可能需要设置一些系统属性。请参阅此处了解一些提示。
如果您想在c3p0中关闭JMX注册,也就是说,如果您想禁用JMXMBean注册,您只需要执行任何特殊操作。
您还可以为您的c3p0 MBean提供自定义和/或稳定的名称。
但您永远不应该进入低级别的JMXAPI,比如定义自己的ObjectName对象。c3p0会帮你处理好的。
请参阅c3p0文档的JMX部分。
p.s.c3p0不包含getdbPoolStatistics()
方法,该方法可能是您自己库的一部分。