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

      大家都知道ADO.NET自带链接池,而且在默认状态下是开启的,如果不设置的话,最大允许的链接个数为100个。

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

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

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

       代码如下:

Code

      大家看上面的代码可以知道,数据库链接没有关闭,而且在这里tablese这个表是不存在的。这样页面就会出错。

      我通过两个客户端不停的按F5执行,然后在运行exec sp_who查看,得到结果如下:

      

54 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
57 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
58 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
59 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
60 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
61 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
62 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
63 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
64 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
65 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
66 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
67 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
68 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
69 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
70 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
71 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
72 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
73 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
74 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
75 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
76 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
77 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
78 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
79 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
80 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
81 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
82 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
83 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
84 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
85 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
86 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
87 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
88 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
89 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
90 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
91 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
92 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
93 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
94 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
95 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
96 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
97 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
98 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
99 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
100 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0
101 0 sleeping                       sa CLONESERVER2                                                                                                                     0 Test AWAITING COMMAND 0

(注:Test代表的是数据库名称)

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

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

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

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

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

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

posted on 2009-06-24 11:21  李业俊  阅读(911)  评论(0编辑  收藏  举报