• Type: Improvement
    • Resolution: Fixed
    • Priority: Major
    • 2.4.42
    • Affects Version/s: 2.4.41
    • Component/s: S2DBCP
    • None

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

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

          koichik added a comment - 対応しました. 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

          koichik added a comment -

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

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

          shinsuke added a comment -

          ありがとうございます!

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

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

          koichik added a comment - 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

          koichik added a comment -

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

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

          koichik added a comment - 対応しました. http://www.seasar.org/source/browse/?view=rev&root=s2container&revision=4440 maxWait プロパティを追加して,空きコネクションを待機する最大時間を秒単位で指定できるようにしました (timeout に合わせて秒単位にしたけどミリ秒単位の方がいい?). 0 を指定すると全く待機しません.-1 (デフォルト) だと無制限に待機します. コネクションが空かなかった場合は SQLException をスローします.

            Assignee:
            koichik
            Reporter:
            shinsuke
            Votes:
            0 Vote for this issue
            Watchers:
            Start watching this issue

              Created:
              Updated:
              Resolved: