web-dev-qa-db-ja.com

Tomcat接続プールが使い果たされました

プロジェクトでApacheTomcatJDBC接続プールを使用しています。重い負荷がかかると、次のエラーが表示され続けるため、混乱しています。

12:26:36,410 ERROR [] (http-/XX.XXX.XXX.X:XXXXX-X) org.Apache.Tomcat.jdbc.pool.PoolExhaustedException: [http-/XX.XXX.XXX.X:XXXXX-X] Timeout: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:4; busy:4; idle:0; lastwait:10000].
12:26:36,411 ERROR [org.Apache.catalina.core.ContainerBase.[jboss.web].[default-Host].[/APP].[AppConf]] (http-/XX.XXX.XXX.X:XXXXX-X) JBWEB000236: Servlet.service() for servlet AppConf threw exception: org.jboss.resteasy.spi.UnhandledException: Java.lang.NullPointerException

私の期待は、プーリングを使用すると、接続が使用可能になるまで、新しい接続の要求がキューに保持されることでした。代わりに、プールが容量に達したときに要求が拒否されたようです。この動作を変更できますか?

ありがとう、

ダル

これは私のプール構成です:

PoolProperties p = new PoolProperties();
p.setUrl("jdbc:Oracle:thin:@" + server + ":" + port + ":" + SID_SVC);
p.setDriverClassName("Oracle.jdbc.driver.OracleDriver");
p.setUsername(username);
p.setPassword(password);
p.setMaxActive(4);
p.setInitialSize(1);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(300);
p.setMinEvictableIdleTimeMillis(150000);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1 from dual");
p.setMinIdle(1);
p.setMaxIdle(2);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors(
    "org.Apache.Tomcat.jdbc.pool.interceptor.ConnectionState;"
    + "org.Apache.Tomcat.jdbc.pool.interceptor.StatementFinalizer;" 
    + "org.Apache.Tomcat.jdbc.pool.interceptor.ResetAbandonedTimer");
9
Dal

ログが_Timeout: Pool empty. Unable to fetch a connection in 10 seconds_で、構成がp.setMaxWait(10000);の場合、これは設計/実装に従って機能します。要求しているスレッドは、接続の待機をあきらめる前に10秒(10000ミリ秒、maxwait)待機します。

これで2つの解決策があります。maxActive接続の数を増やすか、接続リーク/長時間実行されるクエリ(予期しない)がないかどうかを確認します。

12
Karthik Prasad