新开发一个在线考试管理系统网站http://zjsx0575.vicp.net,结果第二天登录网站发现如下错误信息
HTTP Status 500 -
--------------------------------------------------------------------------------
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:74)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.loader.Loader.doList(Loader.java:2148)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
org.hibernate.loader.Loader.list(Loader.java:2024)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
com.futuremap.dao.hibernate.UserinfoDaoHibernate.findUserInfoByUserName(UserinfoDaoHibernate.java:52)
com.futuremap.service.impl.UserServiceImpl.findUserInfoByUserName(UserServiceImpl.java:36)
com.futuremap.service.web.servlet.LoginChecker.doGet(LoginChecker.java:73)
com.futuremap.service.web.servlet.LoginChecker.doPost(LoginChecker.java:132)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.25 logs.
上网一查Mysql的帮助文档发现mysql中有一个设置wait_outtim 为28800相当于8个小时,我的数据库层是采用HIBERNATE,查询了HIBERNATE的资料才发现一个问题,当mysql失去连接以后没有作为HIBERNATE没有检测到连接已经中断,导致产生上述的错误信息。
办法有很多,可以增加wait_timeout的时间,减少连接池内连接的生存周期,使之小于上一项中所设置的 wait_timeout 的值,定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。
想到Hibernate可以使用C3P0的连接池因此可以对C3P0进行配置。
首先要导入c3p0包,我采用的是hibernate3.1的版本,你可以在myeclipse中找到这个文件,c3p0-0.9.0.jar。连接到项目中启动TOMCAT结果出现com/mchange/v2/c3p0/PoolConfig的问题,由于比较匆忙所以忘记了把文件放入WebRoot/WEB-INF/lib导致出现如此的问题。
以下是c3p0的配置文件。
<property name="hibernate.connection.pool_size">1</property>
<property name="hibernate.c3p0.max_size">2</property>
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>