23

私はしばらくの間SOを閲覧していて、その過程で帽子をかみ砕いていますが、私の問題に完全に一致するものを見つけることができません。
要するに、60秒間非アクティブになった後、すばらしいスタックトレース(org.apache.tomcat.jdbc.pool.ConnectionPool abandon)を取得しています。これは、いくつかのサーバー側スレッドの通常の動作です。
Tomcat JDBC接続プーリング(org.apache.tomcat.jdbc.pool.DataSource)を直接
スタックトレースを使用しています。

    2012年10月29日20:55:50org.apache.tomcat.jdbc.pool.ConnectionPoolabandon
    警告:接続は破棄されましたPooledConnection [com.mysql.jdbc.JDBC4Connection@1ad2916]:java.lang.Exception
        org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967)で
        org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721)で
        org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579)で
        org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174)で
        org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111)で
        com.getsom.getConnection(DAO.java:1444)で
        com.getsom.PreparedConnection。(PreparedConnection.java:48)で
        com.getsom.Alarms.run(Alarms.java:492)で

私のPoolPropertiesは次のように構成されています。

    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);

30秒は接続ライフサイクルではあまりないので、setValidationInterval(30000)が私を救うことを望んでいました。とにかく問題は
、この接続を永遠に維持するために何が欠けているのかということです。
知っておきたいこと:接続を要求した関数が30秒前に呼び出されたのに、なぜタイムアウトになるのですか。

4

8 に答える 8

49

私はこのページに来るのに1年以上遅れていますが、私はここでつまずきました。私は同様の問題を経験していて、解決策も必要としていました。それで、私は最終的に私のために働いたものを共有したいと思いました。

私の場合、この記事を見つけて読んだ後、>>> configuration-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");

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

接続がまだ使用されていることを検出したときに、タイムアウトタイマーをリセットして、接続が放棄されたと見なされないようにする必要があります。これを行うには、インターセプターを挿入します。

ステートメントが準備されるか、クエリが実行されるたびに、タイマーは接続プールの放棄タイマーをリセットします。このように...多くのクエリと更新を実行しても、タイムアウトにはなりません。

あなたはずっと前にこの問題を克服した可能性が高いことを念頭に置いて、これが私と同じようにこのページにぶつかる同様の問題を抱えている他の人に役立つことを願っています。

乾杯!

于 2013-12-15T22:15:49.087 に答える
4

PoolConnectionに関連するTomcatWebサイトの情報を見たことがありますか。おそらくあなたが必要なのはプロパティを見ることですminEvictableIdleTimeMillis

質問に答えるには、30秒ごとにアイドル接続と放棄接続をチェックしているため(を参照TimeBetweenEvictionRunsMillis)、30秒に削除可能なアイドルタイムアウトを設定しているため(を参照)、タイムアウトにminEvictableIdleTimeMillisなります。アイドル中にこの例外を受け取っているとのことですが、例外は接続を放棄するのではなく、アイドル状態の接続を閉じた結果であると思われます。私の理解では、接続を放棄することは、(アイドル状態の接続ではなく)予想よりも長くタイムアウトするために使用されます。

個人的には、接続が不必要にリソース(つまり、データベースへの接続)を消費するため、接続を永久に存続させたくありません。自分の要件に合わせて最適化するために、最大接続数、エビクションラン、アイドル時間をいじってみました。これらの値は、ほぼ永久に存在するのに十分な大きさに設定できると思います。それは本当にあなたがしていることに依存します...

申し訳ありませんが、私はここでこれ以上の助けを得ることができませんでした。

于 2012-10-30T07:27:04.437 に答える
4

リソースタグが存在する場合は、tomcat7 conf/server.xmlまたはcontext.xmlに以下のエントリを追加するだけです。

jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;
org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"
于 2016-08-01T15:38:18.550 に答える
1

構成ファイルの「removeAbandonedTimeout」を追跡します。これは、アプリケーションで実行されているクエリの最大数である必要があります。それ以外の場合は、実行の途中で接続を閉じます

于 2014-10-08T08:35:48.577 に答える
1

tomcatのcontext.xmlでデータソースを定義する場合は、次のようにResetAbandonedTimerを追加する必要があります。

jdbcInterceptors="ConnectionState;StatementFinalizer;ResetAbandonedTimer"

ResetAbandonedTimerを設定した後、私のアプリケーションで問題が解決しました。ResetAbandonedTimerインターセプターとremoveAbandoned = "true" removeAbandonedTimeout="60"の間に何らかの関係があることを知らせてください。

于 2017-10-20T04:40:19.787 に答える
0

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

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

ただし、構成した「removeAbandonedTimeout」よりも長く実行されるクエリがありました。「removeAbandonedTimeout」を増やすと、問題は解決しました。

于 2018-02-16T21:03:05.960 に答える
0

同様の問題がありました。つまり、Tomcatは、トランザクションに時間がかかったためにJDBC接続が放棄されたためにJDBC接続を閉じていました。

abandonedidleが異なることを認識し、次のように設定することで解決しました。spring.datasource.tomcat.removeAbandonedTimeout: 86400 #seconds

于 2019-03-02T11:58:40.753 に答える
0

このスレッドは古いことがわかりますが、同様の問題が発生し、最終的にその原因を見つけたので、誰かに役立つかどうかを共有したいと思います。

安らかなWebサービスからの接続を使用しました。クライアントからのサーバー側処理要求のインターフェースで、誤ってメソッドシグネチャに「throwsIOException」を入れていました。

@GET
@Path("/databases")
@Produces(MediaType.APPLICATION_JSON)
public String getAllDatabases() throws IOException {
于 2019-09-10T09:03:50.157 に答える