mysql连接池
在spring2以后默认连接池由Tomcat换成了HikariCP(Hikari Connection Pool),其他常用的数据库连接池有阿里巴巴的Druid,Apache的DBCP(DataBase Connection Pool)等。
可以通过spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
来指定CP并引用相应的包文件来使用该CP。
网上有人做过性能测试,大略的结果是:hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。
HikariCP的高性能得益于最大限度的避免锁竞争.
Druid功能最为全面,提供sql拦截等功能,在数据统计方面做的较为全面,具有良好的扩展性。
要设置连接池默认大小、最大最小连接数等,需要查询使用的响应的CP的配置。
8小时问题
mysql服务端默会在8h无使用的情况下关闭连接,客户端连接池没有检测连接是否有效(主要是性能原因的考虑)而给到用户使用会抛出异常。
解决办法是:
- 把超时时间设置得更长(7天或者30天)
修改mysql的my.cnf配置文件
wait_timeout=x
interactive_timeout=x
- 在业务量小的情况下造成8h都不会使用一次连接,那么设置一个定时器在8h内使用一次连接池的这些连接。
Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1,767 milliseconds ago. The last packet sent successfully to the server was 1,767 milliseconds ago
springboot项目使用tomcat连接的时候有几个配置项采用的就是这种思路
#当从连接池借用连接时,是否测试该连接.
spring.datasource.tomcat.test-on-borrow: false
#当连接空闲时,是否执行连接测试
spring.datasource.tomcat.test-while-idle: true
#指定空闲连接检查、废弃连接清理、空闲连接池大小调整之间的操作时间间隔
spring.datasource.tomcat.time-between-eviction-runs-millis: 18800
- 每次检测连接是否有效 性能差,用于测试环境
springboot + tomcat连接池的另一种配置方式:每次借用连接时检测连接是否有效
spring.datasource.tomcat.validation-query: SELECT 1
#当从连接池借用连接时,是否测试该连接.
spring.datasource.tomcat.test-on-borrow: true
#指定空闲连接检查、废弃连接清理、空闲连接池大小调整之间的操作时间间隔
spring.datasource.tomcat.time-between-eviction-runs-millis: 18800
连接太多(满了)
使用root身份(root身份会预留一个连接)登录数据库查看连接 SHOW FULL PROCESSLIST
,kill 对应的连接id