当前位置:编程学习 > C#/ASP.NET >>

using(SQLConnection conn=new SQLConnection())无法关闭连接池

因项目要实时检测数据库是否能正常连接,于是用以下代码
using(SQLConnection conn=new SQLConnection())
{
conn.Open();
}
如果第一次检测成功,conn的状态是open,这个时候把数据库断掉,conn状态不会改变,(注Pooling用的默认值)

同样的情况,用以下方式第一次检测成功,把数据库断掉conn立马就无法连接了
SQLConnection conn=new SQLConnection()
conn.Open();
conn.Close();

难道using(SQLConnection conn=new SQLConnection())和SQLConnection conn=new SQLConnection()的操作所传递的默认Pooling值不一样?求高手帮助
--------------------编程问答-------------------- 什么意思?没看懂。

using(SQLConnection conn=new SQLConnection())在{}结束时也会调用Close的。 --------------------编程问答-------------------- msdn中的解释:
如果 SqlConnection 超出范围,则不会将其关闭。 因此,必须通过调用Close或Dispose显式关闭该连接。 Close 和 Dispose 的功能等效。 如果连接池值 Pooling 设置为 true 或 yes,则基础连接将返回到连接池。 另一方面,如果 Pooling 设置为 false 或 no,则会关闭到服务器的基础连接。

参考:
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.close.aspx --------------------编程问答-------------------- using(SQLConnection conn=new SQLConnection())
{
    conn.Open();
}
conn只在大括号内部有效.大括号外是使用不了conn的.相当于局部变量,只在这个范围内有效,出了这个范围自动调用了Clost()方法.



SQLConnection conn=new SQLConnection()
conn.Open();
conn.Close();
这个就很明示了,有Open()方法,有Close()方法,如果你已经Clost()还有调用conn那问题就大了,连接池很快就满,程序用一段时间后就连接不上
--------------------编程问答-------------------- 我的意思是在数据库服务正常的情况下,调用这两个方法没什么区别,这个时候如果我把数据库服务停掉,第一种仍然可以打开,第二种情况就卡死(表明已经连接不上了).想知道这两着在本质运行上有什么区别 --------------------编程问答-------------------- 这跟using没关系,也没必要纠结这个,连接池也是通过TCP或命名管道实现的物理连接,
再说说Open() 它只是从池上获取一个基础连接(仅当没获取到时才会去新开物理连接)
结合两者,不能排除由于服务意外关闭,导致物理连接没能及时断开(可能还在等待通讯超时),从而调用成功

关闭以后,你重新开启程序多测试几次看看 --------------------编程问答--------------------
引用 5 楼 dongxinxi 的回复:
这跟using没关系,也没必要纠结这个,连接池也是通过TCP或命名管道实现的物理连接,
再说说Open() 它只是从池上获取一个基础连接(仅当没获取到时才会去新开物理连接)
结合两者,不能排除由于服务意外关闭,导致物理连接没能及时断开(可能还在等待通讯超时),从而调用成功

关闭以后,你重新开启程序多测试几次看看


在实际运行中,这种检测都是在后台执行的,如果要重启程序的话是否不合理 --------------------编程问答--------------------
引用 2 楼 findcaiyzh 的回复:
msdn中的解释:
如果 SqlConnection 超出范围,则不会将其关闭。 因此,必须通过调用Close或Dispose显式关闭该连接。 Close 和 Dispose 的功能等效。 如果连接池值 Pooling 设置为 true 或 yes,则基础连接将返回到连接池。 另一方面,如果 Pooling 设置为 false 或 no,则会关闭到服务器的基础连接。

参考:
http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.close.aspx

第一种情况是没有关闭基础连接,第二种关闭了,想找原因 --------------------编程问答-------------------- 一般情况下不要使用 using,少打几个字价值几何,损失了可读性不合算。
在使用连接池的情况下,除非是事务,否则数据库连接都是用时再打,用完立即关掉。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,