ADO.NET数据库连接池研究(一)

mac2022-06-30  104

      大家都知道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

最新回复(0)