私はいつもリソースを試してみたが、新しいオブジェクトのclose()
メソッドがスコープ外になると呼び出されるように割り当てられていました。try-with-resourcesを新しいオブジェクトインスタンスの悪いフォームなしで使用していますか?
私が知る限り、新しいオブジェクトの作成は必須ではなく、try-with-resources構文では、範囲外になるとclose()を呼び出すためのローカル変数が必要です。したがって、プールから何かを割り当てたり、返されたものがあるかどうかを確認するなど、 "ペアオペレーション"を制御することができます。例えば
、以下MyHandleは、あなたが不要になったプールされたインスタンスを解放する方法を示しています。
// init
class MyHandle implements AutoCloseable {
boolean inUse = false;
public MyHandle allocate() {
inUse = true;
return this;
}
public void close() {
inUse = false;
}
}
MyHandle[] pool = new MyHandle[POOL_SIZE];
for (int i = 0; i < pool.length; i++) {
pool[i] = new MyHandle(i);
}
// allocate
MyHandle allocateFromPool() {
for (int i = 0; i < pool.length; i++) {
if (!pool[i].inUse)
return pool[i].allocate();
}
throw new Exception("pool depleted");
}
// using resources from the pool
try (MyHandle handle = allocateFromPool()) {
// do something
}
// at this point, inUse==false for that handle...
が、このみなさ悪いフォームですか?
編集:私は、このようなロジックを構築するためのより良い選択肢があるかどうか、または上記のアプローチに進むときにいくつかの大きな欠点があるかどうか尋ねています。ライブラリでこれを使用すると、きれいなAPIが得られることがわかります。
EDIT 2:コード例の問題を無視して、私はSOテキストボックスにインラインで書いて、いくつかの例で質問を明確にしています。明らかにそれは実際のコードではありません! :)
接続プールを使用すると、一般的にどのように処理されるのですか: 'try(Connection c = pool_or_datasource.getConnection()){}' ... – assylias