相忘于江湖

不抛弃,不放弃... 请给我勇敢,改变可以改变的;请给我坚强,接受不可以改变的;请给我智慧,分辨这两者。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
大家都知道ADO.NET自带链接池,而且在默认状态下是开启的,如果不设置的话,最大允许的链接个数为100个。

       那么怎么样能够看到连接池里现在活动的链接是多少了?

      讲过研究发现了,数据里的一个存储过程可以帮助我们,那就是sp_who

      为了验证这个事情,我们写了一个asp.net的程序并发布到windows2003的IIS服务器下建立了网站,同时为该网站指定独立的应用程序池。

       代码如下:

ADO.NET数据库连接池研究(一) -查看连接池数 - 萤火虫 - William Shared blogCode
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查看,得到结果如下:

      

54 0 sleeping                       sa CLONESERVER2                                                                                                                    

我就可纳闷了,为什么状态都是sleeping,而且cmd都是AWAITING COMMAND,经过在网上查找发现:

sleeping SPID 目前並未執行。通常表示該 SPID 正處於等待應用程式發出指令的狀態。

AWAITING COMMAND 目前沒有任要需要處理的指令。

       这个就说明,之所有sleeping是因为我们没有关闭数据库链接,而这个链接在连接池里将再也不会被唤醒,随着积累,到了100个以后,其他程序就获得不了连接了,就会出现空引用异常(假如你在使用Connection对象没有做为空判断)。

       然后你把该网站的应用程序池重启,这个时候你再用sp_who去查看,所有的sleeping都不见了。

      总结:上述写的是对连接池中如果连接不关闭的情况进行的研究,不关闭连接时很糟糕的事情,同时也说明了怎么查看连接池中的链接,重要的是对sleeping的理解,一定不能把当做线程一样在休眠了,这就大错特错了,一旦出现这个情况,就说明该链接存在问题,可能没有被释放。


来自:http://hi.baidu.com/westfruit/blog/item/1bbebb097567bcc53bc76382.html
posted on 2012-05-23 11:19  playman0211  阅读(639)  评论(0编辑  收藏  举报