Mysql InnoDB连接池占满问题

本文记录了一次线上Mysql InnoDB数据库连接池占满问题的排查过程,从日志分析、数据库状态检查、JVM配置、代码审查等方面展开,最终发现是Hibernate的connectionReleaseMode配置导致。解决方案包括升级Hibernate版本和调整配置,同时提出需要结合业务场景优化SQL以提高并发性能。
摘要由CSDN通过智能技术生成

简单做一下线上问题排查的记录。使用的Mysql引擎是 InnoDB 5.7。

###排查log
通过排查应用日志(只有其中一台机器),可以马上定位到问题是数据库连接池满了。具体日志如下:


2018-05-10 10:42:16.824  WARN 5 [xec-3303] SqlExceptionHelper               SQL Error: 0, SQLState: null
2018-05-10 10:42:16.824 ERROR 5 [xec-3303] SqlExceptionHelper               wait millis 5000, active 80, maxActive 80
2018-05-10 10:42:16.864 ERROR 5 [xec-3303] StorageOutputService             Error Storage output create,createDTO:StorageOutputCreateDTO{...}.

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection
	at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)

###排查db
通过查看DB的TPS以及连接池占用情况发现,DB的连接数并没有被占满,其他服务可以正常获取DB连接并正常运行。于是在排查具体问题之前,做的第一件事就是调整负载均衡,关闭该服务的流量,如果线上QPS以及其他机器负载不大的话,最好保留问题现场。同时对日志进行进核对(因为当时该微服务没有重要级写数据场景,所以没有再做数据核对,否则要进行数据校准)。

进一步排查。当时首先想到的是是否会存在死锁,导致大多数线程都对锁资源进行竞争。
查看innodb status(以下为展示用的测试环境数据):

$show engine innodb status    


....
Per second averages calculated from the last 29 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 387668 srv_active, 0 srv_shutdown, 21764038 srv_idle
srv_master_thre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值