我有一个简单的测试应用程序,它连接到SQL DB,然后在LINQ中执行查询
执行命令时,我可以看到连接何时打开。
但是当我发出
时 db.Connection.Close();
db.Dispose();
在关闭应用程序之前,SQL中的连接仍然存在。
我是系统中唯一的用户。
答案 0 :(得分:4)
您使用的是连接池吗?这可能会将连接返回到池而不是完全关闭它。
这是一个描述汇集的链接:https://msdn.microsoft.com/en-us/library/8xx3tyca%28v=vs.110%29.aspx
从MSDN(上面的链接):“当应用程序在连接上调用Close时,pooler将它返回到池化的活动连接集,而不是关闭它。一旦连接返回到池,它就是准备好在下次公开电话中重复使用。“
编辑:作为测试,您可以让连接闲置4-8分钟,看看它是否已关闭?
同样来自同一链接:“连接池在空闲大约4-8分钟后,或者如果池中检测到与服务器的连接已被切断,则从池中删除连接。”
答案 1 :(得分:2)
" SQL中的连接仍然存在" - 您应该提供有关此方法的更多信息。我将假设您正在监视来自DBMS端的连接。
启用连接池(这是SqlClient.SqlConnection
的默认行为),关闭SqlConnection
实例不会立即关闭与数据库的基础连接。这种联系仍然存在于温暖的氛围中。状态大约8分钟(如果内存服务)并准备好由具有完全相同连接字符串的另一个SqlConnection
实例使用。
关于你是否应该处理数据库上下文的其他问题。如果明确处理了上下文,则控制基础(非托管)热连接可被另一个SqlConnection
实例使用的时刻,这样可以使同时打开的连接总数保持较低。
注意:行
db.Connection.Close();
之前
db.Dispose();
绝对没必要。