1

我正在尝试使用名为 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() 以及我是否以正确的方式使用它,这都会造成很多混乱?请帮忙。

4

1 回答 1

0

我认为你可能做的工作比你需要的多得多。

默认情况下,c3p0 注册其 MBean。如果您不希望他们注册,则必须为此工作。如果您在监控 c3p0 池及其注册表时遇到问题,您可能需要调试一般的 JMX 内容。您在同一个 JVM 上看到其他 MBean 吗?如果没有,您可能需要设置一些系统属性。请参阅此处了解一些提示。

如果你想在 c3p0 中关闭 JMX 注册,你只需要做一些特殊的事情,也就是说,如果你想禁用 JMX MBean 注册。

您还可以为您的 c3p0 MBean 提供定制的和/或稳定的名称。

但是您永远不必进入低级 JMX API,例如定义您自己的 ObjectName 对象。c3p0 会为您解决这个问题。

请在此处查看c3p0 文档的 JMX 部分。

ps c3p0 不包含任何getdbPoolStatistics()方法,它可能是您自己的库的一部分。

于 2016-12-30T21:54:32.637 回答