ひがやすを技術ブログ

電通国際情報サービスのプログラマ

S2DBCPタイムアウトバグ

V2.0.6のS2DBCPは、フリープールからコネクションを取り出したとき、
タイムアウトをキャンセルしていないというバグがあって、
コネクションが意図しないときにcloseされるケースがあります。m(_ _)m
これまで起きなかったのは、フリープールから取り出したアイテムが
GCで消えてなくなり、タイムアウトの対象にならなかったためだと
思われます。
#S1ではタイムアウトはきちんとキャンセルしていたのに
V2.0.7で対応します。
org.seasar.extension.dbcp.impl.ConnectionPoolImplを次のように
修正すると直ります。
内部クラスFreeItemにdestroyメソッド追加。


public void destroy() {
timeoutTask_.cancel();
timeoutTask_ = null;
connectionWrapper_ = null;
}
checkOutFreePool()を次のように修正。

private ConnectionWrapper checkOutFreePool() throws SQLException {
if (freePool_.isEmpty()) {
return null;
}
FreeItem item = (FreeItem) freePool_.removeLast();
ConnectionWrapper con = item.getConnection();
item.destroy();
return con;
}