2011-02-09 8 views
9

しばらくの間(数時間)、CommunicationsExceptionを取得しています(DBCPから)。エラーメッセージ(Exception内)はこの質問の最後ですが、設定ファイルのいずれかで定義されたwait_timeoutは表示されません。 (どこから見えるのですか?tomcat/confディレクトリのどこかにありますか?)DBCPを使用したTomcatの設定

第2に、Exceptionで提案されているように、「Connector/J接続プロパティ 'autoReconnect = true'」はどこにありますか?ここで設定Tomcatの中のファイルのconf /のcontext.xmlでのリソース定義は次のとおりです。

<Resource name="jdbc/TomcatResourceName" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" 
      username="xxxx" password="yyyy" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://127.0.0.1:3306/dbname?autoReconnect=true"/> 

第三に、なぜJVMは例外をスローする)のexecuteQuery(への呼び出しまで待つのか?接続がタイムアウトした場合、getConnectionメソッドは例外をスローする必要がありますか?これは私が話していたソースコードのセクションです:

 try { 
       conn = getConnection (true); 
       stmt = conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, 
               ResultSet.CONCUR_READ_ONLY); 
       rset = stmt.executeQuery (bQuery); 
       while (rset.next()) { 
        .... 

は最後に、ここでのスタックトレースの第一数行は...

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 84,160,724 milliseconds ago. The last packet sent successfully to the server was 84,160,848 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:532) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3291) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1938) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2107) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2642) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2571) 
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1451) 
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208) 

これらは、私たちの一部は、ある理由からですIDEの設定やDriverManager.getConnection(...)がより信頼できるかもしれない魔法のような魔法に依存するかもしれません。それに関するコメント?あなたの洞察をいただきありがとうございます - MS

答えて

14

DBCPは、今後の接続要求のためのオープン返さmysqlの接続を維持しているので、彼らはMySQL Server timeoutに被害を落ちます。

DBCPには、(Tomcat 5.5 IIRCから使用できる)いくつかの機能があります。

validationQuery="SELECT 1" 
testOnBorrow="true" 

検証は、接続が「借り」メソッドを実行するWebアプリケーションに返す前に有効であることを確認します。もちろんこのフラグはこの機能を有効にします。

タイムアウト(私が考えると8時間)が経過して接続が無効になっている場合、新しい接続がテストされます(作成されていなければ作成されます)。

他の可能なアプローチ:

  1. 効果的な要求が検出される前にも、アイドル状態の接続を確認するために、あなたのリソース設定でtestWhileIdle="true" DBCPを使用します。

  2. (例えばautoReconnect/autoReconnectForPools=true

+1

私が正しく理解していれば、DBCPはプール内の接続を維持しますが、mySqlサーバーはタイムアウトします。この接続アプリに送信された場合、閉じた接続です。意味がありますが、それは私の正しい理解ですか?もう一つの質問:あなたが述べたようにvalidationQuery/testOnBorrowを使う上で、また、context.xmlファイルのtestWhileIdleとautoRecon ...の使用には何か問題はありませんか?彼らはそのファイルに入っていますよね? –

+0

1.ご理解の方。私が指摘したすべてのソリューションは相補的です。 1つを設定することは、他の設定を妨げるものではありません。ベルトとブレースはより良い;-)私は3つのソリューションをすべて実装します。アイドル状態でのテストは、「借り」時間で待ち時間が短くなることを意味します。プロパティの設定は、不適切な切断を減らします。はい、それらはすべてあなたのwebappのcontext.xml(後で$ CATALINA_HOME/conf/Catalina/localhost/yourwebapp.xmlのtomcatによってデプロイされます)のResource部分に入ります。 –

+1

autoReconnectは推奨されていません - http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html – OrangeDog

0

DBCPは本番での使用を目的としたものではありません(このプレゼンテーション:http://www.infoq.com/presentations/Tuning-Tomcat-Mark-Thomas参照)。

私は、C3P0を見てみお勧め:http://www.mchange.com/projects/c3p0/index.html

+1

これは* *というのは本当ではありませんMySQLの接続を強化するために 'て、ConnectionProperties' を使用してください。あなたの比較についてのスレッドがあり、その違いは明白ではない。 http://stackoverflow.com/questions/520585/connection-pooling-options-with-jdbc-dbcp-vs-c3p0およびhttp://stackoverflow.com/questions/490288/is-dbcp-apache-commons-database- connection-pooling-still-relevant – Alfabravo

+0

このプレゼンテーションでは、セッションの長さと同時実行性の要件(どちらの問題も低い)に応じて、BIOとNIOをいつ使用するかについて説明しています。本番環境で使用してはならない理由を指すポインタはどれですか?ちょうど頻繁に接続の考慮事項? Btw、私はC3P0を見ましたが、非常に興味深いです、私たちはDBCPが私たちに問題を与え続けるならば試してみるかもしれません。情報ありがとう、 - MS。 –

+0

私が正しくリコールすれば、このプレゼンテーションには「DBCPは決してプロダクションでの使用を意図したものではない」と言われています。はい、それは干し草の中に針がありますが、聞いた後でそれを忘れることはできませんでした。 – Spajus

関連する問題