关于应用服务器经常报数据库连接过大的问题,本人觉得应该从以下几方面来着手:
1。数据库的连接池配置是否正确:即有没有及时回收空闲的链接,连接的超时时间,及连接池的最大数是否 设置过于合理。
2、检查以下数据库的执行sql,是否会产生慢查询,比如频繁的插入和删除对数据库的阻塞很有影响,以及一 些查询会产生慢请求,将使用数据库产生过长的连接
最近的项目经常会报应用连接过大,开始以为是数据库的连接池配置的问题,因此将原来的proxool换成 dbcp,运行一些时间依然会有此问题,最后换成cp30问题依然出现。最后考虑到应该是程序中的sql造成的,后来 dba提供了数据库的执行报告,发现会频繁的去数据库查询序列号来作为接口的流水号,此处进行了优直接利用时 间蹉来作为流水号,另外就是用户的session信息的存储,用户每次进来会分配一个sesision进行插入数据库,当点 击其它模块时又要查询其session是否过期,最后用户退出时又要删除session。其频繁的语句如下:
1、 delete from T_CHMO_SESSION where SESSION_SP_CODE = :1 and SESSION_KEY = :2
2、 select SESSION_ID, SESSION_SP_CODE, SESSION_KEY, SESSION_START_TIME, SESSION_END_TIME, SESSION_USER_ACCOUNT, SESSION_IMSI, SESSION_AREA_CODE, SESSION_PAY_TYPE, SESSION_PROVINCE_CODE, SESSION_PROVINCE_NAME, SESSION_CITY_NAME from T_CHMO_SESSION where SESSION_SP_CODE = 'eshore' and SESSION_KEY = '0'、
查看其t_chmo_session表有700多万条记录,且没有针对session_sp_code和session_key作为唯一索引,造成其sql在此处是长连接。
解决方案是:对session_sp_code和session_key作为组合索引。另外对于session信息直接放入分布式缓存,不写数据库,此处有点风险,缓存服务器坏掉,则用户登录后就超时,最好的做法是用户进入后插入数据库,然后将信息放入缓存中,每次从缓存中取,取不到再去数据库取,由于建立了组合索引,因此查询和删除上会有很大提高。
经过以优化后发现其连接数确实小了很多。即使并发有200多,其数据库连接也只有20左右.ok问题解决!