C3P0Registry mbean 未注册到 MBeanServer。获取 InstanceNotFoundException
C3P0Registry mbean is not being registered with MBeanServer. Getting InstanceNotFoundException
我正在尝试使用名为 getdbPoolStatistics() 的函数获取 dbpool 详细信息,该函数 returns 是我要监视的所有指标的哈希图。
在 getdbPoolStatistics() 中,我使用 C3P0Registry.getPooledDataSources() which returns 2 db pools 然后使用迭代器访问池,即 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 时,我使用了域:com.mchange.v2.c3p0,键值:type=PooledDataSource 和 identityToken= 我已添加到 ArrayList 中的令牌,用于来自 C3P0Registry 的 2 个数据库池对象。
现在,如果我使用 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,然后尝试获取属性并将其放入 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 了吗?如果没有,您可能需要设置一些系统属性。有关一些提示,请参阅 here。
如果您想在 c3p0 中关闭 JMX 注册,即如果您想禁用 JMX MBean 注册,则只需执行任何特殊操作。
您还可以为您的 c3p0 MBean 自定义 and/or 稳定名称。
但是您永远不必进入低级 JMX API,例如定义您自己的 ObjectName 对象。 c3p0 会为您处理。
请参阅 c3p0 文档的 JMX 部分,here。
p.s。 c3p0 不包含 getdbPoolStatistics()
方法,它可能是您自己的库的一部分。
我正在尝试使用名为 getdbPoolStatistics() 的函数获取 dbpool 详细信息,该函数 returns 是我要监视的所有指标的哈希图。 在 getdbPoolStatistics() 中,我使用 C3P0Registry.getPooledDataSources() which returns 2 db pools 然后使用迭代器访问池,即 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 时,我使用了域:com.mchange.v2.c3p0,键值:type=PooledDataSource 和 identityToken= 我已添加到 ArrayList 中的令牌,用于来自 C3P0Registry 的 2 个数据库池对象。
现在,如果我使用 mbs.registerMBean()
注册 ObjectNamefor (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,然后尝试获取属性并将其放入 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 了吗?如果没有,您可能需要设置一些系统属性。有关一些提示,请参阅 here。
如果您想在 c3p0 中关闭 JMX 注册,即如果您想禁用 JMX MBean 注册,则只需执行任何特殊操作。
您还可以为您的 c3p0 MBean 自定义 and/or 稳定名称。
但是您永远不必进入低级 JMX API,例如定义您自己的 ObjectName 对象。 c3p0 会为您处理。
请参阅 c3p0 文档的 JMX 部分,here。
p.s。 c3p0 不包含 getdbPoolStatistics()
方法,它可能是您自己的库的一部分。