新開發一個線上考試管理系統網站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>