系统突然不稳定,web和数据库cpu和网络资源都正常,发现数据库连接数是平时的5倍左右,初步认为可能是代码部分存在潜在问题,特殊情况下连接不能及时释放,导致连接池默认连接(100个)耗尽。按照以往的案例,进行紧急处理,以快速恢复服务。然而,并未像以前那样恢复服务,连接数瞬间暴增,进一步排查,不存在来自其他服务或者攻击的问题,就怀疑数据库,通过profiler工具跟踪一下,发现和seo_item相关语句执行的持续时间非常长,导致连接占用过长时间不能及时返回(或超时),系统不得不从连接池中申请新的连接,如此下去耗尽连接池连接,由于环境无法调整系统 代码,遂临时优化对应表设计,问题马上解决。
系统设计中,涉及到数据库的地方,有几点需要注意。
1. sqlconnection要及时释放
2.多线程同步处理块内涉及到sqlconnection时要注意(不及时释放,会导致后续请求积压不能及时处理,web服务有可能过载)
3 sql语句要根据数据库设计进行优化
4 从数据库方面来讲,通过工具及时关注服务状况和跟踪sql执行情况,通过数据库反向找出系统有关数据库操作方面不合理的地方