mysqlが自動的に接続を切断する問題を解決する
この2週間、携帯電話のバックグラウンドプログラムを作りました.データベースはMySQL 5です.0、永続層はHibernate 3.0を使用し、追加の接続プールは使用されません.Hibernateは、D r i v erManagerConnectionProviderという独自のデフォルト接続プールをデフォルトで使用します.サーバに配備され、問題は見つかりませんでした.翌日、同僚がインタフェースを呼び出すとエラーが表示されますが、tomcatを再起動すると問題が解決します.先日は時間がなくて、今日また問題が発生して、問題は下図のようです.
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
root cause
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.
ネットで調べたら、mysqlのプロファイルを修正する必要があると言いました.cnf.mysqlはデフォルトで8時間以内にリクエストなしに接続を切断します.mysqldの後にwait_を追加する必要がありますtimeout=172800,interactive_timeout=172800の2行の構成パラメータですが、後でこれでも根絶できないことに気づきましたね.
ネットで探しているソリューション:
なぜか分からなかったが、Tomcatを再起動するとすべて正常に戻ったが、また1日が過ぎて問題が再発した.エラー情報をよく分析すると、問題はデータベース接続部分にあるに違いない.ネット上で大量の情報を調べた後、問題の原因を明らかにした.MySQLのすべての接続に対する有効時間はデフォルトで28800秒で、ちょうど8時間である.つまり、1つの接続が8時間も要求されず、操作されなければ、自動的に切断される.しかし、Hibernateにとって、その接続プールは管理されている接続にMySQLで切断されているかどうか分かりません.プログラムがデータベース接続を使用し、Hibernteの接続プールがMySQLで切断されたプログラムに割り当てられている場合は、エラーが発生します.
確かにこの間違いであることを確認するために、私は本機で以下のテストをしました:まずTomcatを起動して、ウェブサイトは正常に開くことができます;それからシステムの時間を修正して、1日後に調整します;そしてまたサイトを開くと、やはり同じ問題が!MySQL+Hibernateアーキテクチャはかなり一般的なので、この問題もかなり一般的で、読者にもこのようなプロジェクトがあれば、同じテストをして、この問題があるかどうかを見ることをお勧めします.
問題が見つかりました.どうやって解決しますか?構想1:MySQLの接続有効時間を増やす;構想2:プログラム自体から,接続プールに関するパラメータを修正する.明らかに、構想1は実行できないが、一方でこの構想はこの問題の絶対的な解決を保証することはできない.一方、一般的には、プログラムを他のサーバに配置しているので、MySQLの構成を変更することはできません.では、考え方2からしか手に入らない.調査資料によると、Hibernateは、次の接続プールをサポートします.D r i v erManagerConnectionProvider:Hibernateが提供するデフォルトのデータベース接続プールC 3 P 0 ConnectionProvider:C 3 P 0接続プールProxoolConnectionProvider:Proxool接続プールDBCConnectionProvider:DBPP接続プールDatasourceConnectionProvider:代表管理環境でコンテナによって提供されるデータソースでは、デフォルトの接続プールでは、1つの接続を割り当てるときに有効かどうかをテストする機能はサポートされていませんが、C 3 P 0、Proxool、DBPPでは、このような機能が提供されており、上記の問題を解決するのに適しています.各接続プールの効率、安定性、使いやすさを総合的に考慮し、Proxoolの交換を決定した.それは確かに各方面で優れており、配置が便利である.Proxool:1、Hibernateプロファイルの構成方法を見てみましょう.
org.hibernate.connection.ProxoolConnectionProvider proxool.xml mysql
false org.hibernate.dialect.MySQLDialect
...
各属性の意味は以下の通りである:hibernate.connection.provider_class:Proxool接続プールhibernateを使用することを示します.proxool.xml:Proxoolプロファイルの場所を指定します.ここではHibernateのプロファイルと同じディレクトリの下でhibernate.proxool.pool_alias:使用するproxoolを指定します.xmlで定義されたproxool別名.
2、Proxoolプロファイル(proxool.xml):
mysql
jdbc:mysql://localhost/yourDatebase?useUnicode=true&characterEncoding=UTF-8
com.mysql.jdbc.Driver
90000
20
3
20
3
SELECT CURRENT_USER
3、Proxoolのパッケージファイルのダウンロードとインストールアドレス:http://proxool.sourceforge.net/download.htmlダウンロードして解凍した後、libフォルダの下のjarファイルをあなたのサイトのWEB-INF/libにコピーします.
これにより、Proxool構成は成功しました.Tomcatを再起動し、上記のテストを再度行い、問題を解決します.また、C 3 P 0またはDHCPを使用する場合は、以下の資料を参照してください.http://blog.csdn.net/lip8654/archive/2008/02/26/2121387.aspx http://azi.javaeye.com/blog/182146 http://fishyych.javaeye.com/blog/90793もう一つの解決策は
次のJDBC接続のURLを変更します.
jdbc:mysql://hostaddress:3306/schemaname?autoReconnect=true
//jdbc:mysql://192.168.1.110:3306/st_softwarestore_db?autoReconnect=true
AutoReconnect=trueというパラメータを追加すると、この問題を解決できます.
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.hibernate.exception.JDBCConnectionException: could not execute query
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
org.hibernate.loader.Loader.doList(Loader.java:2235)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
org.hibernate.loader.Loader.list(Loader.java:2124)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
com.swift.softwarestore.service.IConDownloadAction.doPost(IConDownloadAction.java:100)
com.swift.softwarestore.service.IConDownloadAction.doGet(IConDownloadAction.java:76)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE:
STACKTRACE:
java.net.SocketException:
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2744)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.swift.softwarestore.service.SoftwareInfoAction.doprint(SoftwareInfoAction.java:146)
at com.swift.softwarestore.service.SoftwareInfoAction.doPost(SoftwareInfoAction.java:86)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
** END NESTED EXCEPTION **
Last packet sent to the server was 1 ms ago.
STACKTRACE:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE:
STACKTRACE:
java.net.SocketException:
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2744)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.swift.softwarestore.service.SoftwareInfoAction.doprint(SoftwareInfoAction.java:146)
at com.swift.softwarestore.service.SoftwareInfoAction.doPost(SoftwareInfoAction.java:86)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
** END NESTED EXCEPTION **
Last packet sent to the server was 1 ms ago.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2759)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.swift.softwarestore.service.SoftwareInfoAction.doprint(SoftwareInfoAction.java:146)
at com.swift.softwarestore.service.SoftwareInfoAction.doPost(SoftwareInfoAction.java:86)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
** END NESTED EXCEPTION **
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
com.mysql.jdbc.Connection.checkClosed(Connection.java:1932)
com.mysql.jdbc.Connection.prepareStatement(Connection.java:4768)
com.mysql.jdbc.Connection.prepareStatement(Connection.java:4734)
org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1577)
org.hibernate.loader.Loader.doQuery(Loader.java:696)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
org.hibernate.loader.Loader.doList(Loader.java:2232)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
org.hibernate.loader.Loader.list(Loader.java:2124)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
com.swift.softwarestore.service.IConDownloadAction.doPost(IConDownloadAction.java:100)
com.swift.softwarestore.service.IConDownloadAction.doGet(IConDownloadAction.java:76)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.
ネットで調べたら、mysqlのプロファイルを修正する必要があると言いました.cnf.mysqlはデフォルトで8時間以内にリクエストなしに接続を切断します.mysqldの後にwait_を追加する必要がありますtimeout=172800,interactive_timeout=172800の2行の構成パラメータですが、後でこれでも根絶できないことに気づきましたね.
ネットで探しているソリューション:
なぜか分からなかったが、Tomcatを再起動するとすべて正常に戻ったが、また1日が過ぎて問題が再発した.エラー情報をよく分析すると、問題はデータベース接続部分にあるに違いない.ネット上で大量の情報を調べた後、問題の原因を明らかにした.MySQLのすべての接続に対する有効時間はデフォルトで28800秒で、ちょうど8時間である.つまり、1つの接続が8時間も要求されず、操作されなければ、自動的に切断される.しかし、Hibernateにとって、その接続プールは管理されている接続にMySQLで切断されているかどうか分かりません.プログラムがデータベース接続を使用し、Hibernteの接続プールがMySQLで切断されたプログラムに割り当てられている場合は、エラーが発生します.
確かにこの間違いであることを確認するために、私は本機で以下のテストをしました:まずTomcatを起動して、ウェブサイトは正常に開くことができます;それからシステムの時間を修正して、1日後に調整します;そしてまたサイトを開くと、やはり同じ問題が!MySQL+Hibernateアーキテクチャはかなり一般的なので、この問題もかなり一般的で、読者にもこのようなプロジェクトがあれば、同じテストをして、この問題があるかどうかを見ることをお勧めします.
問題が見つかりました.どうやって解決しますか?構想1:MySQLの接続有効時間を増やす;構想2:プログラム自体から,接続プールに関するパラメータを修正する.明らかに、構想1は実行できないが、一方でこの構想はこの問題の絶対的な解決を保証することはできない.一方、一般的には、プログラムを他のサーバに配置しているので、MySQLの構成を変更することはできません.では、考え方2からしか手に入らない.調査資料によると、Hibernateは、次の接続プールをサポートします.D r i v erManagerConnectionProvider:Hibernateが提供するデフォルトのデータベース接続プールC 3 P 0 ConnectionProvider:C 3 P 0接続プールProxoolConnectionProvider:Proxool接続プールDBCConnectionProvider:DBPP接続プールDatasourceConnectionProvider:代表管理環境でコンテナによって提供されるデータソースでは、デフォルトの接続プールでは、1つの接続を割り当てるときに有効かどうかをテストする機能はサポートされていませんが、C 3 P 0、Proxool、DBPPでは、このような機能が提供されており、上記の問題を解決するのに適しています.各接続プールの効率、安定性、使いやすさを総合的に考慮し、Proxoolの交換を決定した.それは確かに各方面で優れており、配置が便利である.Proxool:1、Hibernateプロファイルの構成方法を見てみましょう.
各属性の意味は以下の通りである:hibernate.connection.provider_class:Proxool接続プールhibernateを使用することを示します.proxool.xml:Proxoolプロファイルの場所を指定します.ここではHibernateのプロファイルと同じディレクトリの下でhibernate.proxool.pool_alias:使用するproxoolを指定します.xmlで定義されたproxool別名.
2、Proxoolプロファイル(proxool.xml):
3、Proxoolのパッケージファイルのダウンロードとインストールアドレス:http://proxool.sourceforge.net/download.htmlダウンロードして解凍した後、libフォルダの下のjarファイルをあなたのサイトのWEB-INF/libにコピーします.
これにより、Proxool構成は成功しました.Tomcatを再起動し、上記のテストを再度行い、問題を解決します.また、C 3 P 0またはDHCPを使用する場合は、以下の資料を参照してください.http://blog.csdn.net/lip8654/archive/2008/02/26/2121387.aspx http://azi.javaeye.com/blog/182146 http://fishyych.javaeye.com/blog/90793もう一つの解決策は
次のJDBC接続のURLを変更します.
jdbc:mysql://hostaddress:3306/schemaname?autoReconnect=true
//jdbc:mysql://192.168.1.110:3306/st_softwarestore_db?autoReconnect=true
AutoReconnect=trueというパラメータを追加すると、この問題を解決できます.