2016-12-07 74 views
2

私はSlick3.1.1 + HikariCP2.5.1を使用しています。私の設定は次のとおりです。私は< 0.4秒を取って、各クエリで、3秒あたり約1クエリを実行しているSlick/HikariCPで接続が閉じられた後に操作が許可されない

rdsConfig = { 
    url = "jdbc:mysql://mydb.........us-west-2.rds.amazonaws.com:3306/owlschema" 

    driver = "com.mysql.jdbc.Driver" 
    connectionPool = HikariCP 
    maxConnections = 222 
    minConnections = 30 
    keepAliveConnection = true 
    properties = { 
    user = "me" 
    password = "mydarksecret" 
    } 
    numThreads = 40  
} 

。最初のすべてで罰金動作しますが、約2時間後、HikariCPは「接続が閉じられた後、許可されていない操作」に関するエラーが生じ、クローズ接続を開始します。私はこれを回避するために必要ないくつかの他のコンフィグ設定が

15:20:38.288 DEBUG [] [rdsConfig-8] com.zaxxer.hikari.pool.HikariPool - rdsConfig - Timeout failure stats (total=30, active=0, idle=30, waiting=0) 
15:20:38.290 DEBUG [] [rdsConfig connection closer] com.zaxxer.hikari.pool.PoolBase - rdsConfig - Closing connection [email protected]: (connection is evicted or dead) 
15:20:38.333 DEBUG [] [rdsConfig connection closer] com.zaxxer.hikari.pool.PoolBase - rdsConfig - Closing connection [email protected] failed 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_77] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_77] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_77] 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_77] 

ありますか?私はHikariCPが接続をまったく閉じている理由を理解していません。もしそれが欲しいのであれば、私のコードに非接続の接続だけを供給するべきではありませんか?デフォルト設定でうまく動作するという評判があるので、なぜ問題があるのか​​混乱しています。ありがとう。

答えて

5

HikariCPは、接続が無効であると判断して、つまり(connection is evicted or dead)と判断し、これを閉じようとしました。その後、ドライバーは"申し訳ありませんが、接続はすでに閉じています"を予期していません。

「デッドコネクションを閉じる必要があるのはなぜですか?」まあ、一時的に利用できない(または遅い)ため、検証テストに失敗しましたが、接続はドライバのパースペクティブから「生きている」のままです。閉鎖するか、少なくともにしようとすることは、ドライバがリソースをクリーンアップする機会を与えるために不可欠です。

HikariCPは5例で接続を閉じる:

  1. 接続の検証に失敗しました。これはアプリケーションには見えません。接続は廃止され、置き換えられます。 Failed to validate connection...の結果を示すログメッセージが表示されます。
  2. 接続がidleTimeoutより長くアイドルだった。これはアプリケーションには見えません。接続は廃止され、置き換えられます。閉鎖の理由は(connection has passed idleTimeout)です。
  3. 接続がmaxLifetimeに達しました。これはアプリケーションには見えません。接続は廃止され、置き換えられます。閉鎖理由が(connection has passed maxLifetime)の場合、または接続がmaxLifetimeに達した時点で使用されている場合は、後で(connection is evicted or dead)が表示されます。
  4. ユーザーが手動で接続を削除しました。これはアプリケーションには見えません。接続は廃止され、置き換えられます。閉鎖の理由は(connection evicted by user)です。
  5. JDBCコールでが返されません。SQLExceptionこれはアプリケーションに表示されるはずです。閉鎖の理由は(connection is broken)です。

ここにはかなりの変数があります。私はHikariCPのデフォルト設定が、ユーザーが指定した設定に加えて、Slickによって変更される可能性があるかどうかわかりません。周囲のログを表示しないので、その他の関連する問題があるかどうかはわかりません。設定に222の接続が表示されていますが、Timeout Failureでログに記録されたプールの統計情報は(total=30, active=0, idle=30, waiting=0)なので、RDSがあなたに(?)表示されているようです。

起動時にプール設定を含むログメッセージを添付し、例外の1分前にログセクションを添付し、その他の関連する警告についてログファイルをグレープすることをお勧めします。

+0

ありがとうございます。あなたの5つの閉鎖理由のうち、私は '... passed idleTimeout'、' ... passed maxLifetime'、 '... evicted or dead'を取得しています。それぞれのエラーは上記のログに示されているパターンに従います。つまり、すぐに接続が終了しました(evictedまたはdead)、その後、接続が閉じられました。設定ファイルには、表示する質問を編集したので、 'minConnections = 30'も含まれています。 HikariCPは、使用中であっても 'maxLifetime'に達したときに接続を閉じるのですか? – thund

+0

HikariCPは使用中に接続を閉じません。使用中の接続が '' maxLifetime''に達すると、それは追い出しのためにマークされ*、次にスレッドがそれを借りようとするときに追い出されます。 – brettw

関連する問題