最近后台服务突然出现了连接池不够用的情况,不定时的会抛出java.lang.IllegalStateException: Pool not open
2019-09-06 08:21:52.701->java.lang.IllegalStateException: Pool not open
java.lang.IllegalStateException: Pool not open
at org.apache.commons.pool.BaseObjectPool.assertOpen(BaseObjectPool.java:78)
1.由于业务量与系统架构都没有发生变化,初步怀疑是最近开发的代码有问题:
怀疑 没有及时的回收资源,造成连接池泄漏。 在经过对代码的再次check之后,未发现任何问题。
2.检查数据库配置参数
-- 查看线程
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads%';
###+-------------------+-------+
###| Variable_name | Value |
###+-------------------+-------+
###| Threads_cached | 10 |
###| Threads_connected | 326 | ###这个数值指的是打开的连接数
###| Threads_created | 653 |
###| Threads_running | 16 | ###这个数值指的是激活的连接数,这个数值一般远低于connected数值
###+-------------------+-------+
-- Threads_connected 跟show processlist结果相同,表示当前连接数。准确的来说,Threads_running是代表当前并发数
-- 这是是查询数据库当前设置的最大连接数
SHOW VARIABLES LIKE '%max_connections%';
###+-----------------+-------+
###| Variable_name | Value |
###+-----------------+-------+
###| max_connections | 2000 |
###+-----------------+-------+
从数据库的配置来看,没有任何问题。 只有从线程上发现,每次服务没有连接池之后,数据库的线程也就是激活的连接数会很少,明显少于我们的后台服务所需要的连接数。初步怀疑是与数据库有关。怀疑有人重启了数据库。
3.查看数据库的日志 ***.err
获取到了 .err 数据库日志后,查看确实是数据库有重启的记录。但是并非人为重启了数据库。服务也已经恢复了。
2019-09-06 08:24:55 15782 [ERROR] InnoDB: Error in system call pread(). The operating system error number is 5.
2019-09-06 08:24:55 7f9d1b514700 InnoDB: Operating system error number 5 in a file operation.
InnoDB: Error number 5 means 'Input/output error'.
InnoDB: Some operating system error numbers are described at
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html
2019-09-06 08:24:56 15782 [ERROR] InnoDB: File (unknown): 'read' returned OS error 105. Cannot c