Uploaded image for project: 'S2Container'
  1. S2Container
  2. CONTAINER-417

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

XMLWordPrintable

    • Type: Icon: Improvement Improvement
    • Resolution: Fixed
    • Priority: Icon: Major 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) {
          }
      }
      

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

              Created:
              Updated:
              Resolved: