最初に行うことは、いつ接続を開くかを確認することです。それを最小限に抑えることができるかどうかを確認してください。たとえば、さまざまな接続で「n + 1」を実行していますか?
単一のサーバーを使用している場合、ここでの技術的な解決策はセマフォです。たとえば、次のようなものです。
someSemaphore.TakeOne();
try {
using(var conn = GetConnection()) {
...
}
} finally {
someSemaphore.Release();
}
これにより、(たとえば、一部のセマフォが共有されていると仮定してstatic
)一度にそのブロックに「n」回しかアクセスできないことが保証されます。あなたの場合、15 個のスペースでセマフォを作成します。
static readonly Semaphore someSemaphore = new Semaphore(15,15);
でも!注意をお勧めします: 場合によっては、デッドロックが発生する可能性があります: 不十分に作成された 2 つのスレッドがそれぞれ 9 つの接続を必要とすることを想像してください - スレッド A は 7 を必要とし、スレッド B は 8 を必要とします。したがって、WaitOne
タイムアウトを使用することが重要です。
static void TakeConnection() {
if(!someSemaphore.TakeOne(3000)) {
throw new TimeoutException("Unable to reserve connection");
}
}
static void ReleaseConnection() {
someSemaphore.Release();
}
...
TakeConnection();
try {
using(var conn = GetConnection()) {
...
}
} finally {
ReleaseConnection();
}
IDisposable
より便利に使用するために、それをラップすることも可能です。