監視するすべてのメトリックのハッシュマップを返す getdbPoolStatistics() という名前の関数を使用して、dbpool の詳細を取得しようとしています。getdbPoolStatistics() では、2 つの db プールを返す C3P0Registry.getPooledDataSources() を使用してから、イテレーター、つまり connectionIterator を使用してプールにアクセスします。
ObjectName の作成中にさらに使用される token を取得します。
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 の登録中に、C3P0Registry から 2 db プール オブジェクトの ArrayList に追加した Domain: com.mchange.v2.c3p0、key-value: type=PooledDataSource および identityToken= トークンを使用しました。
ここで、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() を使用するかどうか、また正しい方法で使用しているかどうかについて多くの混乱を引き起こしていますか? 助けてください。