Resource Pooing 実装

Takami Torao #ResourcePool
  • このエントリーをはてなブックマークに追加

概要

リソースプーリング (resource pooling) は有限のリソースをプールしアプリケーション内の複数の処理で共有 (resource sharing) する仕組み。一般的に、生成や消滅のコストの高いリソースを初期化を終えた状態で共有、再利用することによるパフォーマンス向上の効果を目的としている。

例えば RDBMS に対するコネクションプーリングは代表的なリソースプーリングである。

実装

リソースプールは Java の BlockingQueueを用いて実装することができる。固定個数のリソースを保持しアプリケーションに貸出や返却を行う必要最小限の機能は以下のように実装することができる。

public class ResourcePool<T> {
  private final BlockingQueue<T> pool;

  public ResourcePool(int size) {
    this.pool = new ArrayBlockingQueue<>(size);

    // fill queue with specified number of resources
    for(int i=0; i<size; i++) {
      T resource = // generate some resource...
      this.pool.put(resource);
    }
  }

  public T acquire() {
    return pool.take();
  }

  public void release(T resource) {
    pool.put(resource);
  }
}

すべてのリソースを貸し出してキューが空になっているとき、acquire() は利用可能なリソースの返却が行われるまで処理をブロックする。

一般的に同期処理の設計下では Loan Pattern を用いて単一の処理ごとに貸出と返却を自動化しておく API 設計が便利であろう。

public <R> R using(Function<T, R> exec) {
  T resource = acquire();
  try {
    return exec(resource);
  } finally {
    release(resource);
  }
}