维护一个toB智能制造项目的时候,发现mysql偶尔会报错:
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.
Cause: org.apache.ibatis.transaction.TransactionException: Error configuring AutoCommit. Your driver may not support getAutoCommit() or setAutoCommit(). Requested setting: false. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 31,056,941 milliseconds ago. The last packet sent successfully to the server was 31,056,941 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.
### The error may exist in org/activiti/db/mapping/entity/Group.xml
### The error may involve org.activiti.engine.impl.persistence.entity.GroupEntityImpl.selectGroupsByUserId
### The error occurred while executing a query
这个错误发生时,重新调用接口即可重新连接上,倒是没有特别大的阻碍,但是偶尔跳出还是烦人。所以我花了点时间研究了下。
这个问题很明显,就是mysql连接断了。
网上查到的解决方案无非以下几种:
1. 按照报错内容上说的,mysql连接url上需要加autoReconnect=true
试过了,但是后来发现,这个参数仅针对mysql4.x有效果,现如今的mysql稳定版大多是5.7,还有很多同行直接使用mysql8.x,所以这个方法没有效果。
2. 添加连接池配置
这个都不用试,标准的spring项目谁会没事只开一个连接😂,所以也没啥用。
3. 如果是本地数据库,把ip换成localhost
这个默认就是换了的,因为外网ip不稳定,自己内部链接还少些资源。但是并不能从根本性上解决这个问题。
4. 直接换掉连接池
这是我现在使用的方法。等我测试几天,再回来在评论区告诉大家答案。原理很简单,spring的连接池默认走的是dbcp,据说这个玩意内部有硬伤,长期空闲连接mysql是会有问题的,所以换成阿里的druid试一试。
还有一点需要各位明白的是,连接池配置是全局有效的,除非你引用的第三方包自己写死了,但是一般正常的第三方包或者开源包这些配置都是跟着主系统的,或者说主系统的配置是能够覆盖的。我这个系统使用了activiti,作为工作流引擎,引入其他的连接池也没啥问题,照常使用。
综上,等结果吧~
在此感谢这篇博客:
https://blog.csdn.net/qq_27471405/article/details/80921846
它总结的很全了。