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