JBoss 6.1 の JDBC プールでかなり厄介なリークが発見されました。
close
これは、基になるステートメントを閉じるために接続のメソッドに依存するコードが原因です。
WrappedConnectionはそれらを閉じますが、コードは次のようになります。
if (statements != null) {
for (Iterator
<Map.Entry<WrappedStatement, Throwable>> i=statements.entrySet().iterator();
i.hasNext(); )
{
Map.Entry<WrappedStatement, Throwable> entry = i.next();
WrappedStatement ws= entry.getKey();
if (trackStatements==BaseWrapperManagedConnectionFactory.TRACK_STATEMENTS_TRUE_INT)
{
Throwable stackTrace = entry.getValue();
log.warn("Closing a statement you left open, please do your own housekeeping",
stackTrace);
}
try
{
ws.internalClose();
}
catch (Throwable t)
{
log.warn("Exception trying to close statement:", t);
}
}
}
ステートメント オブジェクトはマップからステートメントを削除することはなく、マップはどんどん大きくなり、それらのステートメントは結果セットなどを保持します (少なくとも私が使用している JDBC ドライバーでは)。
JBoss の jdbc プールを、これよりも堅牢な代替実装に置き換えた人がいるのだろうか?
これに対する小さな補足として、コードと動作は結果セットと同じです (基本的にコピー アンド ペースト)。設計によりプールに存在する接続)。