用ssh框架做了个小项目,用c3p0做连接池,用的是Mysql 5.1.x ,现问题如下:
现在项目已经发布到服务器,前一天还没什么问题,但是第二天,在运行,老是报com.mysql.jdbc.exceptions.jdbc4.CommunicationsExc...
现在项目已经发布到服务器,前一天还没什么问题,但是第二天,在运行,老是报com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 54,522,939 milliseconds ago. The last packet sent successfully to the server was 54,522,940 milliseconds ago. 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.
网上查了一下,大致意思就是说,当你第一次访问运用,c3p0建立了连接,但是Mysql 连接指等待8小时,超过8小时之后,Mysql就关掉了该进程,而c3p0却没有销毁该连接,当你8小时之后再次访问,就拿的是Mysql关闭的那个连接,所以抛出了此次异常,当你再次访问的时候,又恢复了正常
我的配置文件如下
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<!-- 最大连接数 -->
<property name="hibernate.c3p0.max_size">30</property>
<!-- 最小连接数 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 最大的PreparedStatement的数量 -->
<property name="hibernate.c3p0.max_statements">50</property>
<!-- 如果连接闲置8小时 (8小时内没有进行数据库操作), mysql就会自动断开连接, 要重启tomcat. -->
<!-- 不用hibernate的话, connection url加参数: autoReconnect=true -->
<!-- 用hibernate的话, 加如下属性: -->
<property name="connection.autoReconnect">true</property>
<property name="connection.autoReconnectForPools">true</property>
<property name="connection.is-connection-validation-required">true</property>
<!-- 要是还用c3p0连接池: -->
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">0</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="hibernate.c3p0.validate">true</property>
网上说,可以解决,但是问题依旧,不想改Mysql 的配置文件,那样就不健壮了。请问,怎么解决,跪谢!!!
回复2楼,不用0,也不行!我试过
回复3楼,那方法我也试过,是javaeye上的一篇文章介绍的,有谁有完整的配置,贴出来,让我参考一下也可以啊!!谢谢了
非常感谢 edwin_tech 的回答,我的没用将hibernate连接池托管给spring ,可不可以,直接在hibernate配置文件中,直接用c3p0 呢?
貌似找到问题了!!原因好像在下面两个方法上。
1.Session session = HibernateSessionFactory.getSession();
session.close();
2.Session session = HibernateSessionFactory.getSession();
HibernateSessionFactory.closeSession();
一个是将会话归还给sessionfactory,一个是关闭连接
我用的是前者。并且没有将连接托管给spring。固才会出现该原因。。
非常感谢 edwin_tech 的帮助,谢谢!! 展开
网上查了一下,大致意思就是说,当你第一次访问运用,c3p0建立了连接,但是Mysql 连接指等待8小时,超过8小时之后,Mysql就关掉了该进程,而c3p0却没有销毁该连接,当你8小时之后再次访问,就拿的是Mysql关闭的那个连接,所以抛出了此次异常,当你再次访问的时候,又恢复了正常
我的配置文件如下
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<!-- 最大连接数 -->
<property name="hibernate.c3p0.max_size">30</property>
<!-- 最小连接数 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 最大的PreparedStatement的数量 -->
<property name="hibernate.c3p0.max_statements">50</property>
<!-- 如果连接闲置8小时 (8小时内没有进行数据库操作), mysql就会自动断开连接, 要重启tomcat. -->
<!-- 不用hibernate的话, connection url加参数: autoReconnect=true -->
<!-- 用hibernate的话, 加如下属性: -->
<property name="connection.autoReconnect">true</property>
<property name="connection.autoReconnectForPools">true</property>
<property name="connection.is-connection-validation-required">true</property>
<!-- 要是还用c3p0连接池: -->
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">0</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="hibernate.c3p0.validate">true</property>
网上说,可以解决,但是问题依旧,不想改Mysql 的配置文件,那样就不健壮了。请问,怎么解决,跪谢!!!
回复2楼,不用0,也不行!我试过
回复3楼,那方法我也试过,是javaeye上的一篇文章介绍的,有谁有完整的配置,贴出来,让我参考一下也可以啊!!谢谢了
非常感谢 edwin_tech 的回答,我的没用将hibernate连接池托管给spring ,可不可以,直接在hibernate配置文件中,直接用c3p0 呢?
貌似找到问题了!!原因好像在下面两个方法上。
1.Session session = HibernateSessionFactory.getSession();
session.close();
2.Session session = HibernateSessionFactory.getSession();
HibernateSessionFactory.closeSession();
一个是将会话归还给sessionfactory,一个是关闭连接
我用的是前者。并且没有将连接托管给spring。固才会出现该原因。。
非常感谢 edwin_tech 的帮助,谢谢!! 展开
4个回答
展开全部
关键你给的分太少!如下是上线达1年,稳定运行的配置。
---------------------------------------------------------、
属性文件
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.user=root
c3p0.password=edwin
c3p0.jdbcUrl=jdbc\:mysql\://192.168.1.123\:3306/edwin?useUnicode\=true&characterEncoding\=utf-8
c3p0.minPoolSize = 1
c3p0.maxPoolSize = 50
c3p0.initialPoolSize = 1
c3p0.maxIdleTime = 25000
c3p0.acquireIncrement = 1
c3p0.acquireRetryAttempts = 30
c3p0.acquireRetryDelay = 1000
c3p0.testConnectionOnCheckin = true
c3p0.automaticTestTable = t_c3p0
c3p0.idleConnectionTestPeriod = 18000
c3p0.checkoutTimeout=5000
---------------------------------------------------------
spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-autowire="byName" default-lazy-init="false">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:com/edwin/db/config/c3p0.properties</value>
</property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${c3p0.driverClass}</value>
</property>
<property name="jdbcUrl">
<value>${c3p0.jdbcUrl}</value>
</property>
<property name="user">
<value>${c3p0.user}</value>
</property>
<property name="password">
<value>${c3p0.password}</value>
</property>
<property name="minPoolSize">
<value>${c3p0.minPoolSize}</value>
</property>
<property name="maxPoolSize">
<value>${c3p0.maxPoolSize}</value>
</property>
<property name="initialPoolSize">
<value>${c3p0.initialPoolSize}</value>
</property>
<property name="maxIdleTime">
<value>${c3p0.maxIdleTime}</value>
</property>
<property name="acquireIncrement">
<value>${c3p0.acquireIncrement}</value>
</property>
<property name="acquireRetryAttempts">
<value>${c3p0.acquireRetryAttempts}</value>
</property>
<property name="acquireRetryDelay">
<value>${c3p0.acquireRetryDelay}</value>
</property>
<property name="testConnectionOnCheckin">
<value>${c3p0.testConnectionOnCheckin}</value>
</property>
<property name="automaticTestTable">
<value>${c3p0.automaticTestTable}</value>
</property>
<property name="idleConnectionTestPeriod">
<value>${c3p0.idleConnectionTestPeriod}</value>
</property>
<property name="checkoutTimeout">
<value>${c3p0.checkoutTimeout}</value>
</property>
</bean>
</beans>
-------------------------------------------------
t_c3p0 就是一个测试表!
---------------------------------------------------------、
属性文件
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.user=root
c3p0.password=edwin
c3p0.jdbcUrl=jdbc\:mysql\://192.168.1.123\:3306/edwin?useUnicode\=true&characterEncoding\=utf-8
c3p0.minPoolSize = 1
c3p0.maxPoolSize = 50
c3p0.initialPoolSize = 1
c3p0.maxIdleTime = 25000
c3p0.acquireIncrement = 1
c3p0.acquireRetryAttempts = 30
c3p0.acquireRetryDelay = 1000
c3p0.testConnectionOnCheckin = true
c3p0.automaticTestTable = t_c3p0
c3p0.idleConnectionTestPeriod = 18000
c3p0.checkoutTimeout=5000
---------------------------------------------------------
spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" default-autowire="byName" default-lazy-init="false">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:com/edwin/db/config/c3p0.properties</value>
</property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${c3p0.driverClass}</value>
</property>
<property name="jdbcUrl">
<value>${c3p0.jdbcUrl}</value>
</property>
<property name="user">
<value>${c3p0.user}</value>
</property>
<property name="password">
<value>${c3p0.password}</value>
</property>
<property name="minPoolSize">
<value>${c3p0.minPoolSize}</value>
</property>
<property name="maxPoolSize">
<value>${c3p0.maxPoolSize}</value>
</property>
<property name="initialPoolSize">
<value>${c3p0.initialPoolSize}</value>
</property>
<property name="maxIdleTime">
<value>${c3p0.maxIdleTime}</value>
</property>
<property name="acquireIncrement">
<value>${c3p0.acquireIncrement}</value>
</property>
<property name="acquireRetryAttempts">
<value>${c3p0.acquireRetryAttempts}</value>
</property>
<property name="acquireRetryDelay">
<value>${c3p0.acquireRetryDelay}</value>
</property>
<property name="testConnectionOnCheckin">
<value>${c3p0.testConnectionOnCheckin}</value>
</property>
<property name="automaticTestTable">
<value>${c3p0.automaticTestTable}</value>
</property>
<property name="idleConnectionTestPeriod">
<value>${c3p0.idleConnectionTestPeriod}</value>
</property>
<property name="checkoutTimeout">
<value>${c3p0.checkoutTimeout}</value>
</property>
</bean>
</beans>
-------------------------------------------------
t_c3p0 就是一个测试表!
展开全部
解决的方法有3种:
增加wait_timeout的时间。
减少Connection pools中connection的lifetime。
测试Connection pools中connection的有效性。
C3P0增加以下配置信息:
//获取connnection时测试是否有效
testConnectionOnCheckin = true
//自动测试的table名称,可以自己建个空表来做测试
automaticTestTable=C3P0TestTable
//设置时间必须少于MySQl wait_timeout
idleConnectionTestPeriod = 18000
//设置时间必须少于MySQl wait_timeout
maxIdleTime = 25000
//开启连接检查
testConnectionOnCheckout = true
增加wait_timeout的时间。
减少Connection pools中connection的lifetime。
测试Connection pools中connection的有效性。
C3P0增加以下配置信息:
//获取connnection时测试是否有效
testConnectionOnCheckin = true
//自动测试的table名称,可以自己建个空表来做测试
automaticTestTable=C3P0TestTable
//设置时间必须少于MySQl wait_timeout
idleConnectionTestPeriod = 18000
//设置时间必须少于MySQl wait_timeout
maxIdleTime = 25000
//开启连接检查
testConnectionOnCheckout = true
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
<property name="hibernate.c3p0.idle_test_period">0</property>
<property name="hibernate.c3p0.timeout">0</property>
不能用 0
<property name="hibernate.c3p0.timeout">0</property>
不能用 0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
关注
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询