数据库为mysql,客户端使用hibernate进行连接,结果长时间没有数据访问的话,重新访问数据库就会报错:
javax.servlet.ServletException: org.hibernate.exception.JDBCConnectionException: could not execute query org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858) com.monet.common.servlet.ExtendActionServlet.process(ExtendActionServlet.java:85) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
org.hibernate.exception.JDBCConnectionException: could not execute query org.hibernate.exception.SQLStateConverter.convert(Unknown Source) org.hibernate.exception.JDBCExceptionHelper.convert(Unknown Source) org.hibernate.loader.Loader.doList(Unknown Source) org.hibernate.loader.Loader.listIgnoreQueryCache(Unknown Source) org.hibernate.loader.Loader.list(Unknown Source) org.hibernate.loader.hql.QueryLoader.list(Unknown Source) org.hibernate.hql.ast.QueryTranslatorImpl.list(Unknown Source) org.hibernate.engine.query.HQLQueryPlan.performList(Unknown Source) org.hibernate.impl.SessionImpl.list(Unknown Source) org.hibernate.impl.QueryImpl.list(Unknown Source) com.monet.ecai.bean.MemberDAO.getUserName(MemberDAO.java:42) com.monet.lottery.user.UserAction.doUserReg(UserAction.java:154) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) com.monet.common.servlet.ActionExtend.callActionMethod(ActionExtend.java:214) com.monet.common.servlet.ActionExtend.execute(ActionExtend.java:144) org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53) org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64) org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48) org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858) com.monet.common.servlet.ExtendActionServlet.process(ExtendActionServlet.java:85) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was55512 seconds ago.The last packet sent successfully to the server was 55512 seconds ago, which 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. sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) java.lang.reflect.Constructor.newInstance(Unknown Source) com.mysql.jdbc.Util.handleNewInstance(Util.java:406) com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246) com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917) com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885) org.hibernate.jdbc.AbstractBatcher.getResultSet(Unknown Source) org.hibernate.loader.Loader.getResultSet(Unknown Source) org.hibernate.loader.Loader.doQuery(Unknown Source) org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Unknown Source) org.hibernate.loader.Loader.doList(Unknown Source) org.hibernate.loader.Loader.listIgnoreQueryCache(Unknown Source) org.hibernate.loader.Loader.list(Unknown Source) org.hibernate.loader.hql.QueryLoader.list(Unknown Source) org.hibernate.hql.ast.QueryTranslatorImpl.list(Unknown Source) org.hibernate.engine.query.HQLQueryPlan.performList(Unknown Source) org.hibernate.impl.SessionImpl.list(Unknown Source) org.hibernate.impl.QueryImpl.list(Unknown Source) com.monet.ecai.bean.MemberDAO.getUserName(MemberDAO.java:42) com.monet.lottery.user.UserAction.doUserReg(UserAction.java:154) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) com.monet.common.servlet.ActionExtend.callActionMethod(ActionExtend.java:214) com.monet.common.servlet.ActionExtend.execute(ActionExtend.java:144) org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53) org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64) org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48) org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858) com.monet.common.servlet.ExtendActionServlet.process(ExtendActionServlet.java:85) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
java.net.SocketException: Software caused connection abort: socket write error java.net.SocketOutputStream.socketWrite0(Native Method) java.net.SocketOutputStream.socketWrite(Unknown Source) java.net.SocketOutputStream.write(Unknown Source) java.io.BufferedOutputStream.flushBuffer(Unknown Source) java.io.BufferedOutputStream.flush(Unknown Source) com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3227) com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917) com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885) org.hibernate.jdbc.AbstractBatcher.getResultSet(Unknown Source) org.hibernate.loader.Loader.getResultSet(Unknown Source) org.hibernate.loader.Loader.doQuery(Unknown Source) org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Unknown Source) org.hibernate.loader.Loader.doList(Unknown Source) org.hibernate.loader.Loader.listIgnoreQueryCache(Unknown Source) org.hibernate.loader.Loader.list(Unknown Source) org.hibernate.loader.hql.QueryLoader.list(Unknown Source) org.hibernate.hql.ast.QueryTranslatorImpl.list(Unknown Source) org.hibernate.engine.query.HQLQueryPlan.performList(Unknown Source) org.hibernate.impl.SessionImpl.list(Unknown Source) org.hibernate.impl.QueryImpl.list(Unknown Source) com.monet.ecai.bean.MemberDAO.getUserName(MemberDAO.java:42) com.monet.lottery.user.UserAction.doUserReg(UserAction.java:154) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) com.monet.common.servlet.ActionExtend.callActionMethod(ActionExtend.java:214) com.monet.common.servlet.ActionExtend.execute(ActionExtend.java:144) org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53) org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64) org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48) org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858) com.monet.common.servlet.ExtendActionServlet.process(ExtendActionServlet.java:85) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459) javax.servlet.http.HttpServlet.service(HttpServlet.java:710) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
查阅相关文档,造成报错的原因在于:Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。
hibernate 配置如下
<property name="hibernate.connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider </property> <property name="hibernate.c3p0.min_size">10</property> <property name="hibernate.c3p0.max_size">100</property> <property name="hibernate.c3p0.timeout">10</property> <property name="hibernate.c3p0.max_statements">100</property> <property name="hibernate.c3p0.idle_test_period">300</property> <property name="hibernate.c3p0.acquire_increment">5</property> <property name="hibernate.c3p0.validate">true</property>