大家都知道ADO.NET自带链接池,而且在默认状态下是开启的,如果不设置的话,最大允许的链接个数为100个。
我就可纳闷了,为什么状态都是sleeping,而且cmd都是AWAITING COMMAND,经过在网上查找发现:
那么怎么样能够看到连接池里现在活动的链接是多少了?
讲过研究发现了,数据里的一个存储过程可以帮助我们,那就是sp_who
为了验证这个事情,我们写了一个asp.net的程序并发布到windows2003的IIS服务器下建立了网站,同时为该网站指定独立的应用程序池。
代码如下:
大家看上面的代码可以知道,数据库链接没有关闭,而且在这里tablese这个表是不存在的。这样页面就会出错。
我通过两个客户端不停的按F5执行,然后在运行exec sp_who查看,得到结果如下:
54 | 0 | sleeping | sa | CLONESERVER2 |
sleeping | SPID 目前並未執行。通常表示該 SPID 正處於等待應用程式發出指令的狀態。 |
AWAITING COMMAND | 目前沒有任要需要處理的指令。 |
这个就说明,之所有sleeping是因为我们没有关闭数据库链接,而这个链接在连接池里将再也不会被唤醒,随着积累,到了100个以后,其他程序就获得不了连接了,就会出现空引用异常(假如你在使用Connection对象没有做为空判断)。
然后你把该网站的应用程序池重启,这个时候你再用sp_who去查看,所有的sleeping都不见了。
总结:上述写的是对连接池中如果连接不关闭的情况进行的研究,不关闭连接时很糟糕的事情,同时也说明了怎么查看连接池中的链接,重要的是对sleeping的理解,一定不能把当做线程一样在休眠了,这就大错特错了,一旦出现这个情况,就说明该链接存在问题,可能没有被释放。
来自:http://hi.baidu.com/westfruit/blog/item/1bbebb097567bcc53bc76382.html