2012-10-29 15 views
8

私はしばらくブラウジングしていましたが、プロセス中に私の帽子を噛んでいましたが、問題に完全に一致するものは見つかりませんでした。
要するに、60秒間使用しないと、すぐにスタックトレース(org.apache.tomcat.jdbc.pool.ConnectionPool放棄)が得られます。これは、サーバーサイドスレッドの2つの正常な動作です。WebApp(Tomcat-jdbc)プールされたDB接続の放棄例外を放棄

マイPoolPropertiesのように構成されている
 
    Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon 
    WARNING: Connection has been abandoned PooledConnection[[email protected]]:java.lang.Exception 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967) 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721) 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579) 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174) 
     at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111) 
     at com.getsom.getConnection(DAO.java:1444) 
     at com.getsom.PreparedConnection.(PreparedConnection.java:48) 
     at com.getsom.Alarms.run(Alarms.java:492) 

は、次のとおりです:

PoolProperties pp = new PoolProperties(); 

    pp.setUrl(someValidUrl); 
    pp.setDriverClassName("com.mysql.jdbc.Driver"); 
    pp.setUsername(someUser); 
    pp.setPassword(somePassword); 
    pp.setJmxEnabled(true); 
    pp.setTestWhileIdle(true); 
    pp.setTestOnBorrow(true); 
    pp.setValidationQuery("SELECT 1"); 
    pp.setTestOnReturn(false); 
    pp.setValidationInterval(30000); 
    pp.setTimeBetweenEvictionRunsMillis(30000); 
    pp.setMaxActive(100); 
    pp.setInitialSize(10); 
    pp.setMaxWait(10000); 
    pp.setMinEvictableIdleTimeMillis(30000); 
    pp.setMinIdle(10); 

    pp.setLogAbandoned(true); 
    pp.setRemoveAbandoned(true); 
    pp.setRemoveAbandonedTimeout(60); 
    pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ 
     "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");  

    setPoolProperties(pp); 

Iを
は私がプーリングTomcatのJDBC接続(org.apache.tomcat.jdbc.pool.DataSource)直接
スタックトレースを使用しています30秒は接続のライフサイクルにあまりないので、setValidationInterval(30000)が私を助けてくれることを期待していました。とにかく質問は:
私はこの接続を永遠に生かし続けるために何が欠けていますか?
知っておきたいこと:30秒前に呼び出されたにもかかわらず、接続を要求した関数でタイムアウトするのはなぜですか?

答えて

30

私はこのページが来る1年以上遅れていますが、同様の問題を経験していて解決策が必要なので、私はここでうんざりしました。だから私は最終的に私のために働くものを分け合うと思った。

私の場合は、この記事を検索して読んだ後に>>>configuring-jdbc-pool-high-concurrency - このようなインターセプタをプール設定に追加しました。

"org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer" 

あなたがsetJdbcInterceptors(...)を行う(上記のあなたの投稿コードから)行は次のようになりますように。

p.setJdbcInterceptors(
      "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" 
      + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;" 
      + "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"); 

説明 - 記事から引用し、それは言います。

接続がまだ使用中であることが検出されると、接続が破棄されないようにタイムアウトタイマーをリセットします。これはインターセプターを挿入することで行います。

ステートメントが作成されるか、クエリが実行されるたびに、タイマーは接続プールの放棄タイマーをリセットします。このように、多くのクエリと更新を実行すると、タイムアウトにはなりません。あなたが最も可能性の高い、長い時間前に問題を克服してきた心の中で

ベアリング、私はまだ私がやったように、これは誰がこのページにバンプ同様の問題が発生することができます願っています。

乾杯!

+8

回答する年: – MonoThreaded

+0

この回答は私のソリューションです!君たちありがとう! – Samarland

2

PoolConnectionに関するTomcatのウェブサイトに関する情報をご覧になりましたか。あなたはアイドル&をチェックしているので、接続ごとに30秒を放棄(TimeBetweenEvictionRunsMillisを参照)、あなたが30でevictableアイドルタイムアウトを設定しているので、おそらく、あなたが必要なもの、あなたがタイムアウトしている、あなたの質問に答えるためにプロパティでminEvictableIdleTimeMillis

を見ることです秒(minEvictableIdleTimeMillisを参照してください)、あなたはあなたが持っているものになります。アイドル状態でこの例外を受け取っていると言われていますが、例外は接続を破棄するのではなく、アイドル状態の接続を閉じた結果と思われます。私の理解から、接続を放棄することは、(アイドル状態の接続とは対照的に)予想よりも長いクエリをタイムアウトさせるために使用されます。

個人的には、リソースを無駄に消費している(接続がDBになっている)ので、接続を永遠に残したいとは思わないでしょう。私は自分の要求に合わせて最適化するために、最大限の接続、退去実行、アイドルタイムで遊んでいきます。私はあなたがほとんど永遠になるようにこれらの値を十分に大きく設定できると思います!あなたがしていることに本当に依存しています...

私はここでもっと助けることができませんでした。

+0

はい、私はこれを広く読んでいます。私は、これが追い払い以上のものを放棄したと考えています。私の前提は、ConnectionPoolがこれらの接続を生かし続けるということでした。 – MonoThreaded

+0

クエリを実行しているときにエラーが発生していますか? 60秒以上実行しているクエリが奇妙に思えるでしょう。 – ramsinb

+0

Nope。問題のスレッドはアイドル状態です。 ConnectionPoolは接続が破棄されたとみなしているため、これは問題です。 – MonoThreaded

1

設定ファイルの 'removeAbandonedTimeout'トラック。これは、アプリケーション内で最大実行クエリでなければなりません。それはジュストあなたにTomcatのcontext.xmlにして、あなたのデータソースを定義する場合は、あなたが追加する必要があり、ファイルのconf/server.xmlでtomcat7に

jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; 
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer; 
org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer" 
+0

私は同じ問題を抱えており、既にremoveAbandonedTimeoutが設定されていますが、残念なことにそれは役に立ちません。 –

+0

Tomcatのリソース属性を "追跡"する方法を説明できますか? – Navigatron

1

の途中で接続が閉じられますothewise ResetAbandonedTimer以下のように:ResetAbandonedTimerを設定

jdbcInterceptors="ConnectionState;StatementFinalizer;ResetAbandonedTimer" 

した後は、問題は私が知っているように、あなたの要求、自分のアプリケーションで解決しまっResetAbandonedTimerインターセプターとremoveAbandoned =「true」をremoveAbandonedTimeoutを=「60」の間に何らかの関係がある

1

を追加し、実行

0

この質問に対する回答は私にとって非常に役に立ちました。

私の場合、「ResetAbandonedTimer」JDBCインターセプターはすでに設定されていますが、

しかし、私が設定した「removeAbandonedTimeout」よりも長い時間実行されたクエリがありました。 "removeAbandonedTimeout"を増やすと、問題は解決しました。

関連する問題