hibernate c3p0

本文介绍了一个关于Hibernate+C3P0连接池在长时间闲置后导致MySQL连接失效的问题及解决方案。通过调整C3P0配置参数,确保连接的有效性和可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      使用是:struts+hibernate   jdk:1.5  hibernate:3.0
      服务器:tomcat5.0    数据库:mysql5.0
  

       本人是第一次使用Hibernate,前面已经有同事开发,我只是接着做.在做的过程中发现了一些问题.然后花了很大精力解决.下面只就问题最大的一个现象拿出来提一下.

      因为我之前已经有人做了一部分,所以我就接着做,等做完上线之后发现一个很严重的问题.前一天晚上发布的,第二天来登录的时候就已经登录不进去.而且会报这样的错误:

org.apache.catalina.core.ContainerBase.[Catalina].[admin.goosign.com].[/GoosignAdmin].[action] - Servlet.service() for servlet action threw exception
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.io.EOFException

STACKTRACE:

java.io.EOFException
 at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)
 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
 at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
 at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
 at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
 at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
 at org.hibernate.loader.Loader.doQuery(Loader.java:662)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
 at org.hibernate.loader.Loader.doList(Loader.java:2145)
 at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
 at org.hibernate.loader.Loader.list(Loader.java:2024)
 at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
 at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
 at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
 at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
 at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
 at com.goosign.login.biz.UserValidator.validator(UserValidator.java:63)
 at com.goosign.login.forward.LoginAction.execute(LoginAction.java:66)
 at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
 at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
 at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
 at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
 at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at com.goosign.utils.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:83)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at com.goosign.utils.SecurityFilter.doFilter(SecurityFilter.java:70)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834)
 at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
 at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
 at java.lang.Thread.run(Unknown Source)


** END NESTED EXCEPTION **

 

Last packet sent to the server was 0 ms ago.
 at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2586)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
 at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
 at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
 at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
 at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
 at org.hibernate.loader.Loader.doQuery(Loader.java:662)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
 at org.hibernate.loader.Loader.doList(Loader.java:2145)
 at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
 at org.hibernate.loader.Loader.list(Loader.java:2024)
 at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
 at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
 at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
 at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
 at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
 at com.goosign.login.biz.UserValidator.validator(UserValidator.java:63)
 at com.goosign.login.forward.LoginAction.execute(LoginAction.java:66)
 at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:53)
 at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:64)
 at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
 at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
 at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
 at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
 at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at com.goosign.utils.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:83)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at com.goosign.utils.SecurityFilter.doFilter(SecurityFilter.java:70)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834)
 at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
 at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
 at java.lang.Thread.run(Unknown Source)

开始以为是session没关闭,但修改之后第二天还出现这样的问题.后来查出原因:

Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常.

 

在hibernate.cfg.xml中增加C3P0以下配置信息

    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property>
    <property name="hibernate.c3p0.max_size">100 </property>
    <property name="hibernate.c3p0.min_size">10 </property>
    <property name="hibernate.c3p0.timeout">10 </property> 

    <property name="hibernate.c3p0.acquireRetryAttempts">30    </property>
    <property name="hibernate.c3p0.acquireIncrement">5</property>
    <property name="hibernate.c3p0.idleConnectionTestPeriod">300</property>
    <property name="hibernate.c3p0.maxPoolSize">100</property>
    <property name="hibernate.c3p0.maxIdleTime">300</property>
    <property name="hibernate.c3p0.maxStatements">50</property>
    <property name="hibernate.c3p0.minPoolSize">10 </property>
    <property name="hibernate.c3p0.validate">false </property>

要引进c3p0的jar包:

下载地址如下:

http://sourceforge.net/project/showfiles.php?group_id=25357(直接点右键下载)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值