2016-12-30 10 views
1

私は、監視するすべてのメトリックのハッシュマップを返すgetdbPoolStatistics()という名前の関数を使用して、dbpoolの詳細を取得しようとしています。 getdbPoolStatistics()では、私は2 dbプールを返すC3P0Registry.getPooledDataSources()を使用し、イテレーター、すなわちconnectionIteratorを使用してプールにアクセスします。C3P0Registry MBeanがMBeanServerに登録されていません。 InstanceNotFoundExceptionを取得する

トークンを取得するには、ObjectNameの作成時にさらに使用します。

ArrayList<String> pooledDataSourcesIdentityTokenList = new ArrayList<String>();  

mbeanは、監視情報を提供します。

Iterator<PooledDataSource> connectionIterator = C3P0Registry.getPooledDataSources().iterator();  

トークンを取得してArrayListに追加します。私たちがMBeanの登録中のMBeanServer

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 

を取得する必要があります。この後

while(connectionIterator.hasNext()) { 
     pooledDataSourcesIdentityTokenList.add(connectionIterator.next().getIdentityToken()); 
} 

、私はドメインを使用している:com.mchange.v2.c3p0、キーと値:タイプ= 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")); 
} 

私が手:InstanceAlreadyExistsExceptionとして

error: unreported exception InstanceAlreadyExistsException; must be caught or declared to be thrown mbs.registerMBean(C3P0Registry.getPooledDataSources() , objName); 

を、私は私がのその行を削除してregisterMBean()は、多くの例で使用されていなかったことがわかった。またMBeanの を登録していないと考えコードを試してみました。

私はその後、私はエラーを取得するの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")); 
} 

に入れて、その後のObjectNameを作り続けるとした場合:

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()を使用するかどうか、そして私が正しい方法でそれを使用しているかどうかを混乱させますか?助けてください。

答えて

0

私はあなたが必要以上に多くの仕事をしていると思います。

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

c3p0でJMX登録をオフにする場合、つまりJMX MBean登録を無効にする場合は、特別な操作を行うだけです。

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

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

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

p.s. c3p0にはgetdbPoolStatistics()メソッドが含まれていません。これは独自のライブラリの一部である可能性があります。

+0

本当に、c3p0には既にmbeansが登録されていました。ありがとう:) – Falcon34

+0

私はあなたのために働いて非常にうれしいよ! –

関連する問題