1

監視するすべてのメトリックのハッシュマップを返す 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 の登録中に、C3P​​0Registry から 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() を使用するかどうか、また正しい方法で使用しているかどうかについて多くの混乱を引き起こしていますか? 助けてください。

4

1 に答える 1

0

必要以上に多くの仕事をしている可能性があると思います。

c3p0 はデフォルトで MBean を登録します。それらを登録したくない場合は、それに取り組む必要があります。c3p0 プールとそのレジストリの監視に問題がある場合は、一般的な JMX のデバッグが必要になる場合があります。同じ JVM 上に他の MBean がありますか? そうでない場合は、いくつかのシステム プロパティを設定する必要があります。いくつかのヒントについては、こちらを参照してください。

c3p0 で JMX 登録を OFF にする場合、つまり JMX MBean 登録を無効にする場合にのみ、何か特別なことを行う必要があります。

c3p0 MBean にカスタマイズされた名前や安定した名前を付けることもできます。

ただし、独自の ObjectName オブジェクトを定義するなど、低レベルの JMX API を使用する必要はありません。c3p0 がそれを処理します。

c3p0 のドキュメントの JMX セクションを参照してください

ps c3p0 にはgetdbPoolStatistics()メソッドが含まれていないため、独自のライブラリの一部である可能性があります。

于 2016-12-30T21:54:32.637 に答える