リソースプール

2011 年 3 月 29 日

多くのプログラムは、作成とメンテナンスにコストのかかるリソースを利用する必要があります。その例として、データベース接続やスレッドがあります。リソースプールは、これらのリソースを管理するための優れた方法を提供します。

クライアントがデータベース接続を使用する必要がある場合、自分自身で作成するのではなく、プールにそれを提供するように依頼します。クライアントが接続を使用したら、プールに返却します。多くの場合、プールは起動時に多数の接続を作成します。プールのサイズは通常、構成制御を通じて設定でき、クライアントのニーズとリソースを維持するためのコストに応じて調整できます。

クライアントが新しいリソースを要求したときにすべてのリソースが使用されている場合は、いくつかの応答があります。1 つは例外をスローし、もう 1 つはリソースが利用可能になるまでクライアントを待機させることです。可能であれば、さらに接続を作成してプールを拡大することが多くの場合最良の応答です。その方法により、プールは初期サイズを小さく設定し、必要に応じて拡大できます。これを行う場合、多数のリソースがアイドル状態かどうかを確認するメカニズムが必要になる場合があり、リソースの保持に問題がある場合はプールを縮小する必要があります。動的拡大を行ったとしても、おそらくプールのサイズに何らかの制限を設ける必要があり、その時点でプールはもう拡大させたくありません。

リソースプールでよく発生する問題の 1 つは、クライアントがリソースをハンドバックしないというものです。これはリソースリークです。これに対抗するための優れた方法は、テスト中にプール制限を 1 に設定し、プールを構成して、リソースの制限要求が例外を発生させるようにすることです。それにより、リークしているクライアントを見つけやすくなります。

リソースプールに関する詳細情報の良いソースは、POSA 3 の「Pooling」パターンです。