14

Apache Commons DBCP を使用しています。DBCP の内部動作 (アクティブおよびアイドル接続の数) を追跡するタスクがあります。

DBCP にはそのようなログがまったくないことがわかりました。はい、接続がプールから借用されたときに BasicDataSource のステータスを出力するコードを書くことは可能です。ただし、接続オブジェクトはプールについて何も知らないため、接続が返されたときまたは閉じられたときに BasicDataSource のステータスを追跡する方法はありません。

何か案は?

4

4 に答える 4

7

側面があなたの悩みの解決策になるかもしれないと思います。チェックアウト:

基本的に、DBCP 内のいくつかのメソッドの実行を「ラッチ」するアスペクトを 1 つまたは 2 つ作成できます。

何かのようなもの:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;

@Aspect
public class AroundExample {

  @Around("org.apache.commons.dbcp.PoolingDataSource.getConnection()")
  public Object doBasicPStuff(ProceedingJoinPoint pjp) throws Throwable {
    // write code to do what you want
    final PoolingDataSource ds = (PoolingDataSource) pjp.getThis();
    // log whatever you want

    // let it finish
    Object retVal = pjp.proceed();
    // stop stopwatch
    return retVal;
  }

}

それはほんの一例です。アスペクトは非常に強力で、やりたいことを実現するさまざまな方法があります。コードは、Spring を使用しているかどうか、および正確に何をログに記録するかによって異なります。

PS上記のコードはテストしていません。

于 2010-08-31T01:18:43.287 に答える
1

DBCP の BasicDataSource には、実際にプールとプール ファクトリを作成する保護されたメソッドがいくつか含まれています。それをサブクラス化し、それらのメソッドをオーバーライドして動作を変更できます。たとえば、プール ファクトリを取得したり、自分のものに置き換えたりします。そのプールを取得したら、コード内でプールの状態を取得できます。

于 2011-02-17T01:18:08.010 に答える
0

AOP は、プールから接続の使用状況を追跡する方法です。ただし、それほど簡単ではありません。次のことを行う必要があります。

  1. (Decorator パターン) Connection をラップする ConnectionWrapper クラスを作成し、close() メソッドをオーバーライドして、接続 ID、スレッド ID、アクション 'close' を追加でログに記録します。
  2. データソースの getConnection() メソッドをインターセプトします。
  3. そのメソッドで、接続 ID、スレッド ID、およびアクション「open」をログに記録します。
  4. 同じメソッドで、元の接続を装飾し、 ConnectionWrapper インスタンスを返します

このセットアップを使用すると、プールから/への接続の借用と返却の両方を追跡できます。

于 2012-03-11T04:20:24.123 に答える