我编写的网站放到服务空间上,每过一定的时间,1(24小时)天左右tomcat5.5服务器中就会报错,页面能显示,但是所有的数据不能显示了,查看日志信息发现数据库连接不了,连接不了mysql. 
上网查了很多的资料,所mysql会出现8个小时的空闲时间会自动收回空闲的连接.与是我修改了mysql的wait timeout,wait timeout的值默认是28800 (3600*8),但最多只能是32767,不能再大了。 
可是还是出现服务器过一段时间断开数据库连接这个问题,在数据库的URL连接中加入autoReconnect=true也不行,而且我的mysql数据库是5.0的,autoReconnect=true只对4.0以内的才有效.这个问题搞的我很头痛啊,急着求解答,网上又找了资料,说改用c3p0可行,于是换成c3p0管理连接池,但是还是不行,实在是想不到其它的好办法了,希望有人能够给个答案,小弟感激不尽啊. 是否换成mysql5.1和tomcat6.0可行么?因为我本机的开发环境是mysql5.1+tomcat6.0,而空间服务主机上是mysql5.0+tomcat5.5来的.
我的网站是用:spring2.5+hibernate3.0+freeer2.4做的.用tomcat5.5+mysql5.0 做服务器和数据库 
-------------------------------------下面是在没用c3p0之前出的错:----------------------------------- org.springframework.dao.DataAccessResourceFailureException: Cannot open connection; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection 
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:627) 
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) 
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:921) 
at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:913) 
at com.underwear.front.dao.impl.FrontDaoImpl.find(FrontDaoImpl.java:19) 
at com.underwear.front.service.QueryWareInfoService.getWareImageList(QueryWareInfoService.java:118) 
at com.underwear.front.action.QueryWareInfoController.queryWareinfo(QueryWareInfoController.java:63) 
at sun.reflect.GeneratedMethodAccessor259.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) 
at com.underwear.comm.filter.ContextPathFilter.doFilter(ContextPathFilter.java:19) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:825) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:731) 
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:526) 
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) 
at java.lang.Thread.run(Unknown Source) 
Caused by: org.hibernate.exception.JDBCConnectionException: Cannot open connection Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Server connection failure during transaction. Due to underlying exception: 'java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind'. ** BEGIN NESTED EXCEPTION ** MESSAGE: Unrecognized Windows Sockets error: 0: JVM_Bind STACKTRACE: ** END NESTED EXCEPTION ** 
-------------------------------------下面是配置了c3p0之后出的错:----------------------------------- spring 配置的c3p0信息<!-- 定义数据源Bean,使用C3P0数据源实现 --> 
<bean id="mysqlDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
destroy-method="close"> 
<!-- 指定连接数据库的驱动 --> 
<property name="driverClass" value="com.mysql.jdbc.Driver" /> 
<!-- 指定连接数据库的URL --> 
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/underwear?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8" /> 
<!-- 指定连接数据库的用户名 --> 
<property name="user" value="root" /> 
<!-- 指定连接数据库的密码 --> 
<property name="password" value="root" /> 
<!-- 指定连接数据库连接池的最大连接数 --> 
<property name="maxPoolSize" value="200" /> 
<!-- 指定连接数据库连接池的最小连接数 --> 
<property name="minPoolSize" value="10" /> 
<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 
<property name="initialPoolSize" value="1" /> 
<!-- 指定最大空闲时间,20000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 
<property name="maxIdleTime" value="20000" /> 
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 
<property name="acquireIncrement" value="3" /> 
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0--> 
<property name="maxStatements" value="1000" /> 
<!--每180秒检查所有连接池中的空闲连接。Default: 0 --> 
<property name="idleConnectionTestPeriod" value="180" /> 
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 
<property name="acquireRetryAttempts" value="30" /> 
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false--> 
<property name="breakAfterAcquireFailure" value="false" /> 
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false --> 
<property name="testConnectionOnCheckout" value="false" />  
</bean> 
出现的错误的信息: 
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Connections could not be acquired from the underlying database!; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) 
at org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424) 
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410) 
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:525) 
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:519) 
at com.underwear.front.dao.impl.FrontDaoImpl.get(FrontDaoImpl.java:15) 
at com.underwear.front.service.QueryWareInfoService.queryWareInfo(QueryWareInfoService.java:31) 
at com.underwear.front.action.QueryWareInfoController.queryWareinfo(QueryWareInfoController.java:55) 
at sun.reflect.GeneratedMethodAccessor174.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313) 
 
org.hibernate.exception.GenericJDBCException: Cannot open connection 这个问题搞了好几天了,没有好的结果,求各位帮忙解答了,小弟分不多,小弟先谢过各位. 

解决方案 »

  1.   

    开始我用dbcp的默认设置也是这样的,后来改用c3p0后就解决了。
    下面是我使用的配置:
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mlm?useUnicode=true&amp;characterEncoding=UTF-8</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password"></property>
            <!--指定连接的语言-->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="show_sql">false</property> <!--是否将运行期生成的SQL输出到日志以供调试-->
            <property name="hibernate.hbm2ddl.auto">validate</property>        <!-- C3P0连接池设定-->
            <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
            <property name="hibernate.c3p0.min_size">5</property><!--连接池的最小连接数-->
            <property name="hibernate.c3p0.max_size">30</property><!--最大连接数-->
            <property name="hibernate.c3p0.timeout">1800</property><!--连接超时时间-->
            <property name="hibernate.c3p0.max_statements">100</property><!--statemnets缓存大小-->
            <!--每隔多少秒检测连接是否可正常使用 -->
            <!--为hibernate配置连接池,推荐用c3p0,然后配置c3p0的反空闲设置idle_test_period,-->
            <!--(只要小于MySQL的wait timeout即可,这句话后经证实不一定)。 -->
            <property name="hibernate.c3p0.idle_test_period">121</property>
            <!--当池中的连接耗尽的时候,一次性增加的连接数量,默认为3-->
            <property name="hibernate.c3p0.acquire_increment">1</property>
            <property name="hibernate.c3p0.validate">true</property>
      

  2.   

    开始我用dbcp的默认设置也是这样的,后来改用c3p0后就解决了。
    下面是我使用的配置:
    一楼,谢谢你的代码,你用的是hibernate的配置文件,可我用的是spring来管理配置信息的,我改成hibernate的试试.
      

  3.   

    你用 Spring 管理的话,根本不需要把 c3p0 的配置写到 XML 中去,你可以写个 c3p0.properties 文件放到 src 下 C3P0 的 ComboPooledDataSource 会自动加载的。
      

  4.   

    你有没有用HibernateDaoSupport, 不要用this.getSession(); 改用hibernateTemplate
      

  5.   

    我觉得是服务器做了mysql的自动备份,备份的时候需要先停掉mysql服务,然后备份文件,然后启动mysql服务,是不是这个原因呢
      

  6.   


    代码中有用到HibernateDaoSupport也有用到this.getSession(),不过我用完之后有手动的关闭session.
    之前没有手动加关闭Session会话功能,通常一天之内会断一次。不过有个问题我要说明的是,自从我在前台的DAO中加入了关闭Session的会话功能,也就是用完之后清除关闭动作,服务器断开的连接的时间由之前的一天,变为现在的5天才断开一次,我的DAO分前台和后台两个,我现在在前台的DAO中用手动关闭Session,但是后台的DAO中没有加入手动关闭Session的方法,我怀疑是Session会话用的太多而引起的会话连接问题,导制资源变少最后到断开,我继续试试在后台的DAO中为Session手动关闭会话。
    如果真是这样,那我之前用过的Hibernate全都是白学习了。
      

  7.   

    在配置文件中要写成  <property name="minPoolSize"><value>1</value></property> 格式不能写成 这样<property name="properties">
       <props>
        <prop key="c3p0.initialPoolSize">1</prop>   </props></property>c3p0不能完全识别!!如果配置真确c3p0的这个属性可以解决这个问题
    <!-- 指定最大空闲时间,20000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->  
    <property name="maxIdleTime" value="20000" />  
      

  8.   

    我曾经碰到过一个mysql的问题.就是会自己挂掉.用过各种办法无法解决.最后的解决办法是重装系统.好了...无解.