大家都知道ADO.NET自带链接池,而且在默认状态下是开启的,如果不设置的话,最大允许的链接个数为100个。
那么怎么样能够看到连接池里现在活动的链接是多少了?
讲过研究发现了,数据里的一个存储过程可以帮助我们,那就是sp_who
为了验证这个事情,我们写了一个asp.net的程序并发布到windows2003的IIS服务器下建立了网站,同时为该网站指定独立的应用程序池。
代码如下:
Code SqlConnection conn = new SqlConnection("server=192.168.0.213;uid=sa;pwd=cpkf!@#$%^;database=test;"); conn.Open(); SqlCommand cmd = new SqlCommand("select * from Tablese", conn); SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); sda.Fill(ds);大家看上面的代码可以知道,数据库链接没有关闭,而且在这里tablese这个表是不存在的。这样页面就会出错。
我通过两个客户端不停的按F5执行,然后在运行exec sp_who查看,得到结果如下:
540sleeping saCLONESERVER2 0TestAWAITING COMMAND0570sleeping saCLONESERVER2 0TestAWAITING COMMAND0580sleeping saCLONESERVER2 0TestAWAITING COMMAND0590sleeping saCLONESERVER2 0TestAWAITING COMMAND0600sleeping saCLONESERVER2 0TestAWAITING COMMAND0610sleeping saCLONESERVER2 0TestAWAITING COMMAND0620sleeping saCLONESERVER2 0TestAWAITING COMMAND0630sleeping saCLONESERVER2 0TestAWAITING COMMAND0640sleeping saCLONESERVER2 0TestAWAITING COMMAND0650sleeping saCLONESERVER2 0TestAWAITING COMMAND0660sleeping saCLONESERVER2 0TestAWAITING COMMAND0670sleeping saCLONESERVER2 0TestAWAITING COMMAND0680sleeping saCLONESERVER2 0TestAWAITING COMMAND0690sleeping saCLONESERVER2 0TestAWAITING COMMAND0700sleeping saCLONESERVER2 0TestAWAITING COMMAND0710sleeping saCLONESERVER2 0TestAWAITING COMMAND0720sleeping saCLONESERVER2 0TestAWAITING COMMAND0730sleeping saCLONESERVER2 0TestAWAITING COMMAND0740sleeping saCLONESERVER2 0TestAWAITING COMMAND0750sleeping saCLONESERVER2 0TestAWAITING COMMAND0760sleeping saCLONESERVER2 0TestAWAITING COMMAND0770sleeping saCLONESERVER2 0TestAWAITING COMMAND0780sleeping saCLONESERVER2 0TestAWAITING COMMAND0790sleeping saCLONESERVER2 0TestAWAITING COMMAND0800sleeping saCLONESERVER2 0TestAWAITING COMMAND0810sleeping saCLONESERVER2 0TestAWAITING COMMAND0820sleeping saCLONESERVER2 0TestAWAITING COMMAND0830sleeping saCLONESERVER2 0TestAWAITING COMMAND0840sleeping saCLONESERVER2 0TestAWAITING COMMAND0850sleeping saCLONESERVER2 0TestAWAITING COMMAND0860sleeping saCLONESERVER2 0TestAWAITING COMMAND0870sleeping saCLONESERVER2 0TestAWAITING COMMAND0880sleeping saCLONESERVER2 0TestAWAITING COMMAND0890sleeping saCLONESERVER2 0TestAWAITING COMMAND0900sleeping saCLONESERVER2 0TestAWAITING COMMAND0910sleeping saCLONESERVER2 0TestAWAITING COMMAND0920sleeping saCLONESERVER2 0TestAWAITING COMMAND0930sleeping saCLONESERVER2 0TestAWAITING COMMAND0940sleeping saCLONESERVER2 0TestAWAITING COMMAND0950sleeping saCLONESERVER2 0TestAWAITING COMMAND0960sleeping saCLONESERVER2 0TestAWAITING COMMAND0970sleeping saCLONESERVER2 0TestAWAITING COMMAND0980sleeping saCLONESERVER2 0TestAWAITING COMMAND0990sleeping saCLONESERVER2 0TestAWAITING COMMAND01000sleeping saCLONESERVER2 0TestAWAITING COMMAND01010sleeping saCLONESERVER2 0TestAWAITING COMMAND0
(注:Test代表的是数据库名称)
我就可纳闷了,为什么状态都是sleeping,而且cmd都是AWAITING COMMAND,经过在网上查找发现:
sleepingSPID 目前並未執行。通常表示該 SPID 正處於等待應用程式發出指令的狀態。
AWAITING COMMAND目前沒有任要需要處理的指令。
这个就说明,之所有sleeping是因为我们没有关闭数据库链接,而这个链接在连接池里将再也不会被唤醒,随着积累,到了100个以后,其他程序就获得不了连接了,就会出现空引用异常(假如你在使用Connection对象没有做为空判断)。
然后你把该网站的应用程序池重启,这个时候你再用sp_who去查看,所有的sleeping都不见了。
总结:上述写的是对连接池中如果连接不关闭的情况进行的研究,不关闭连接时很糟糕的事情,同时也说明了怎么查看连接池中的链接,重要的是对sleeping的理解,一定不能把当做线程一样在休眠了,这就大错特错了,一旦出现这个情况,就说明该链接存在问题,可能没有被释放。
转载于:https://www.cnblogs.com/liyejun/archive/2009/06/24/1510053.html