我处理一个 SqlConnection 对象,但当然它并没有真正关闭。我需要关闭连接才能不锁定数据库对象。如何防止关闭的连接持有锁?
对上述句子的解释给不知道的人:
当您关闭 ADO 或 ADO.NET 连接时,您实际上并没有切断与 SQL Server 的连接。ADO/ADO.NET 基础结构保持连接,以防您想再次使用它。连接一直在所谓的“连接池”中徘徊。
几分钟不使用后,连接实际上会关闭。虽然,不是真的。TCP/IP 有它自己的方法来保持 TCP 连接打开几分钟(在“ CLOSE_WAIT ”状态)。这是在您要求再次打开到同一 IP:Port 的 TCP 连接时完成的。如果是这样,它可以使用已经打开的 TCP 连接。
使用连接池和 SQL Server,仍会建立与 SQL Server 的连接。每个连接都有一个它所在的数据库上下文。只要一个连接位于该数据库中:它就持有该数据库上的共享数据库 (S-DB) 锁。
共享数据库锁的意思很简单,“请不要在我在其中时删除此数据库。”
如何防止它在我的数据库上持有共享锁,同时保持连接池的好处?
我现在的临时解决方案是每次开发人员调用 Dispose:
connection.Dispose()
将其更改为对全局辅助函数的调用:
Database.DisposeConnection(connection);
它将数据库上下文更改为master:
public static void DisposeConnection(SqlConnection connection)
{
//Stop holding a database lock - in my database at least
ADOHelper.ExecuteNonQuery(connection, "USE master");
connection.Dispose();
}
它解决了我眼前的问题;关闭的连接没有锁定我的数据库。
但现在我担心连接池会扰乱它的大脑——因为我在它背后切换了数据库上下文。
如果有人不知道或不知道:
从SDK:
Close和Dispose在功能上是等效的。