近日,收到某项目反馈,应用报错,连接不上数据库。如下图所示:
从图上看到报错不能新建连接,也不是数据库驱动抛出的错误。
(1)为保险起见,登录数据库查询数据库的最大会话数,和设置的最大会话数,看是否有超过。
select * from v$dm_ini where para_name like 'MAX_SESSIONS'; --结果是1500
select count(*) from v$sessions; --结果是482
从查询出的结果来看,数据库的会话数没有超过限制,所以排除这个原因。
(2)既然数据库连接数没超,那么就需要排查应用设置的连接池多大,是否有超过。询问应用人员,得知连接池里面设置的最大连接数是300。
(3)进一步确认每台应用服务器的连接数在数据库里面是否达到限制。这里通过客户端的主机名或主机ip来分组查询。
select clnt_host,count(*) from v$sessions group by clnt_name order by 1 desc;
查询结果如下图所示:
从图上可以看到有个应用已经达到连接池设置的300限制值了。
至此故障原因已经找到,应用不能连接数据库,是因为某个应用的连接数达到连接池限制值导致,需要释放连接后才能获取到连接,才能登录数据库。这里需要交给应用人员进一步分析为何没有释放连接。
文章
阅读量
获赞