[CONTAINER-417] [S2DBCP] maxPoolSize で指定された数のコネクションが既に使われている場合,コネクションが空くまで待機する最大時間を maxWait プロパティで指定できるようにしました. Created: 2010-03-25  Updated: 2010-03-25  Resolved: 2010-03-25

Status: Resolved
Project: S2Container
Component/s: S2DBCP
Affects Version/s: 2.4.41
Fix Version/s: 2.4.42

Type: Improvement Priority: Major
Reporter: shinsuke Assignee: koichik
Resolution: Fixed Votes: 0
Labels: None


 Description   

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) {
    }
}


 Comments   
Comment by koichik [ 2010-03-25 ]

対応しました.
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

Comment by koichik [ 2010-03-25 ]

maxWait プロパティをミリ秒単位に変更するため再オープン.

Comment by shinsuke [ 2010-03-25 ]

ありがとうございます!

待つ秒の単位ですが、現在遭遇している問題では
細かく調整しにいく可能性が高いため、ミリ秒単位で
指定できると助かります。よろしくお願いします。

Comment by koichik [ 2010-03-25 ]

SNAPSHOT をデプロイしました.
(コードの修正は s2-extension のみですが,s2-framework に含まれるメッセージリソースも修正してます)

http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-framework/2.4.42-SNAPSHOT/s2-framework-2.4.42-20100325.100335-3.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-extension/2.4.42-SNAPSHOT/s2-extension-2.4.42-20100325.100335-3.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-tiger/2.4.42-SNAPSHOT/s2-tiger-2.4.42-20100325.101808-3.jar

Comment by koichik [ 2010-03-25 ]

対応しました.
http://www.seasar.org/source/browse/?view=rev&root=s2container&revision=4440

maxWait プロパティを追加して,空きコネクションを待機する最大時間を秒単位で指定できるようにしました (timeout に合わせて秒単位にしたけどミリ秒単位の方がいい?).
0 を指定すると全く待機しません.-1 (デフォルト) だと無制限に待機します.
コネクションが空かなかった場合は SQLException をスローします.

Generated at Wed Dec 17 09:58:20 JST 2025 using Jira 10.7.4#10070004-sha1:cce36d3b4f8de9f0780b0dcddfc0514af065ac94.