ConnectionPoolImpl#checkOut() で maxPoolSize を超えて
コネクションを要求されると、現状、空くまで wait() に
なってしまいます。この場合ですと、高負荷サイトにおいては
これにより処理が詰まってしまいます(運用環境によっては
ここで詰まることによりTomcat/Apacheがレスポンスを返すことが
できず、その結果ロードバランサから切り離されたりなどの問題に
遭遇することもあるかと思います)。ここで詰まるより
maxPoolSizeを超えた場合にはExceptionを投げて例外処理で
処理を継続できた方が良い場合もあるかと思います。
たとえば、ConnectionPoolImpl#checkOut()で以下のように
最大プールサイズを超えた場合にExceptionで抜けるような
プロパティ throwExceptionOnExceededMaxPoolSize みたいな
ものがあると上記の問題を回避できると考えています。
変更も限定的なので、デフォルト値をfalseにしておけば
既存のコードに影響を与えないと考えています。
while (getMaxPoolSize() > 0 && getActivePoolSize() + getTxActivePoolSize() >= getMaxPoolSize()) { // 追加: ここから if(throwExceptionOnExceededMaxPoolSize){ throw new SIllegalStateException("ESSR03XX", null); } // 追加: ここまで try { wait(); } catch (InterruptedException ignore) { } }
対応しました.
http://www.seasar.org/source/browse/?view=rev&root=s2container&revision=4441
SNAPSHOT をデプロイしました.
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-framework/2.4.42-SNAPSHOT/s2-framework-2.4.42-20100325.103940-4.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-extension/2.4.42-SNAPSHOT/s2-extension-2.4.42-20100325.103940-4.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-tiger/2.4.42-SNAPSHOT/s2-tiger-2.4.42-20100325.104427-4.jar