最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

使用c3p0与DBCP连接池,造成的MySql8小时问题解决方案_MySQL

来源:懂视网 责编:小采 时间:2020-11-09 19:11:12
文档

使用c3p0与DBCP连接池,造成的MySql8小时问题解决方案_MySQL

使用c3p0与DBCP连接池,造成的MySql8小时问题解决方案_MySQL:本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自动断开连接的解决方案。首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方案。 基本问题解决 项目环境: Java Web项目框架为Spring MVC+JP
推荐度:
导读使用c3p0与DBCP连接池,造成的MySql8小时问题解决方案_MySQL:本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自动断开连接的解决方案。首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方案。 基本问题解决 项目环境: Java Web项目框架为Spring MVC+JP
本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自动断开连接的解决方案。首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方案。

基本问题解决

项目环境:

Java Web项目框架为Spring MVC+JPA,使用c3p0连接池,发布环境为Tomcat 7

错误描述:

项目运行一段时间(大概几个小时)之后访问时会出现第一次访问报错,再次访问正常的现象,且多次出现此问题。

报错日志:

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC begin transaction failed:
  2. at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:428)
  3. at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)
  4. at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417)
  5. at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255)
  6. at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
  7. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
  8. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
  9. at com.appcarcare.cube.service.UserService$$EnhancerByCGLIB$$a4429cba.getUserDao()
  10. at com.appcarcare.cube.servlet.DataCenterServlet$SqlTimer.connectSql(DataCenterServlet.java:76)
  11. at com.appcarcare.cube.servlet.DataCenterServlet$SqlTimer.run(DataCenterServlet.java:70)
  12. at java.util.TimerThread.mainLoop(Timer.java:555)
  13. at java.util.TimerThread.run(Timer.java:505)
  14. Caused by: javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC begin transaction failed:
  15. at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
  16. at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
  17. at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1397)
  18. at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:62)
  19. at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:71)
  20. at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:60)
  21. at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:378)
  22. ... 11 more
  23. Caused by: org.hibernate.TransactionException: JDBC begin transaction failed:
  24. at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:76)
  25. at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
  26. at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1426)
  27. at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:59)
  28. ... 14 more
  29. Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
  30. The last packet successfully received from the server was 1,836,166 milliseconds ago. The last packet sent successfully to the server was 29,134 milliseconds ago.
  31. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  32. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
  33. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  34. at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
  35. at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
  36. at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
  37. at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3567)
  38. at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456)
  39. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3997)
  40. at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
  41. at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
  42. at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2713)
  43. at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5060)
  44. at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
  45. at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:72)
  46. ... 17 more
  47. Caused by: java.net.SocketException: Software caused connection abort: recv failed
  48. at java.net.SocketInputStream.socketRead0(Native Method)
  49. at java.net.SocketInputStream.read(SocketInputStream.java:150)
  50. at java.net.SocketInputStream.read(SocketInputStream.java:121)
  51. at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
  52. at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
  53. at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
  54. at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3014)
  55. at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3467)
  56. ... 25 more


原因分析:

MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。

解决方案(解决这个问题的办法有三种,推荐第二种):

1. 增加 MySQL 的 wait_timeout 属性的值

修改mysql安装目录下的配置文件 my.ini文件(如果没有此文件,复制“my-default.ini”文件,生成“复件 my-default.ini”文件。将“复件 my-default.ini”文件重命名成“my.ini” ),在文件中设置:

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. wait_timeout=31536000
  2. interactive_timeout=31536000

这两个参数的默认值是8小时(60*60*8=28800)。

注意: 1.wait_timeout的最大值只允许2147483 (24天左右)

2.修改配置文件为网上大部分文章所提供的方式,也可以使用mysql命令对这两个属性进行修改



2. 减少连接池内连接的生存周期

减少连接池内连接的生存周期,使之小于上一项中所设置的wait_timeout 的值。

修改 c3p0 的配置文件,在 Spring 的配置文件中设置:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

3. 定期使用连接池内的连接

定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。

修改 c3p0 的配置文件,在 Spring 的配置文件中设置:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

知识扩展

C3P0

C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。 c3p0配置文件

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1.   
  2.   3
  3.   
  4.   30
  5.   
  6.   1000
  7.   
  8.   false
  9.   
  10.   属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试
  11.   使用。Default: null-->
  12.   Test
  13.   
  14.   保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
  15.   获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
  16.   false
  17.   
  18.   SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->
  19.   100
  20.   
  21.   Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
  22.   
  23.   
  24.   Default: null-->
  25.   null
  26.   
  27.   (文档原文)作者强烈建议不使用的一个属性-->
  28.   false
  29.   
  30.   60
  31.   
  32.   3
  33.   
  34.   60
  35.   
  36.   15
  37.   
  38.   属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
  39.   如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
  40.   100
  41.   
  42.   
  43.   
  44.   通过多线程实现多个操作同时被执行。Default: 3-->
  45.   3
  46.   
  47.   的数据源时。Default: null-->
  48.   root
  49.   
  50.   password
  51.   
  52.   
  53.   
  54.   测试的表必须在初始数据源的时候就存在。Default: null-->
  55.   select id from test where id=1
  56.   
  57.   300
  58.   
  59.   时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
  60.   等方法来提升连接测试的性能。Default: false -->
  61.   false
  62.   
  63.   true
  64.   
  65.   root
  66.   在Hibernate(spring管理)中的配置:
  67.   
  68.   oracle.jdbc.driver.OracleDriver
  69.   jdbc:oracle:thin:@localhost:1521:Test
  70.   Kay
  71.   root
  72.   
  73.   
  74.   
  75.   
  76.   
  77.   
  78.   
  79.   
  80.   
  81.   
  82.   
  83.   
  84.   
  85.   
  86.   
  87.   
  88.   
  89.   ###########################
  90.   ### C3P0 Connection Pool###
  91.   ###########################
  92.   #hibernate.c3p0.max_size 2
  93.   #hibernate.c3p0.min_size 2
  94.   #hibernate.c3p0.timeout 5000
  95.   #hibernate.c3p0.max_statements 100
  96.   #hibernate.c3p0.idle_test_period 3000
  97.   #hibernate.c3p0.acquire_increment 2
  98.   #hibernate.c3p0.validate false
  99.   在hibernate.cfg.xml文件里面加入如下的配置:
  100.   
  101.   20
  102.   
  103.   5
  104.   
  105.   120
  106.   
  107.   100
  108.   
  109.   120
  110.   
  111.   2
  112.   
  113.   true

文档

使用c3p0与DBCP连接池,造成的MySql8小时问题解决方案_MySQL

使用c3p0与DBCP连接池,造成的MySql8小时问题解决方案_MySQL:本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自动断开连接的解决方案。首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方案。 基本问题解决 项目环境: Java Web项目框架为Spring MVC+JP
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top