C3P0Registry mbean未向MBeanServer注册.正在获取InstanceNotFoundExcept



我正试图使用名为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()方法,该方法可能是您自己库的一部分。

相关内容

  • 没有找到相关文章

最新更新