我处理一个SqlConnection对象,但当然它并没有真正关闭.我需要关闭连接以不保持数据库对象的锁定.如何防止闭合连接锁定?
不知道的人对上述信息的解释:
关闭ADO或ADO.NET连接时,实际上并未切断与SQL Server的连接.ADO/ADO.NET基础结构可以保持连接,以防您再次使用它.这些连接在所谓的"连接池"中保持不变.
在没有使用几分钟后,连接将实际关闭.虽然,不是真的.TCP/IP有自己的方法来保持TCP连接打开几分钟(处于" CLOSE_WAIT "状态).如果您要求打开到同一IP:端口的TCP连接,则会执行此操作.如果是这样,它可以使用已经打开的TCP连接.
使用连接池和SQL Server,仍然建立与SQL Server的连接.每个连接都有一个它所在的数据库上下文.只要连接位于该数据库中:它就拥有该数据库上的共享数据库(S-DB)锁.
共享数据库锁只是意味着"请不要删除此数据库."
如何防止它在我的数据库上持有共享锁,同时保持连接池的好处?
我的ad-hoc解决方案现在每次都是开发人员调用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:
关闭和处置在功能上是等效的.
Eamon Nerbon.. 7
您可以将数据库置于单用户模式以便还原它.IIRC,这样的......
ALTER DATABASE TheDatabaseToRestore SET SINGLE_USER WITH ROLLBACK IMMEDIATE; RESTORE DATABASE TheDatabaseToRestore FROM DISK =N'Z:\Path\To\Backup\BackupFile'; ALTER DATABASE TheDatabaseToRestore SET MULTI_USER;
请参阅:获取使用SQL 还原SQL Server和/或还原数据库备份的独占访问权限以获取更多背景信息.
编辑: 单用户模式用于备份和恢复(在非快速版本上,我是定期使用它).使用它会启动所有其他连接,并且无法建立新连接.我没有使用各种"WITH"选项,例如"ROLLBACK IMMEDIATE",但它们的用法似乎很简单.
您可以将数据库置于单用户模式以便还原它.IIRC,这样的......
ALTER DATABASE TheDatabaseToRestore SET SINGLE_USER WITH ROLLBACK IMMEDIATE; RESTORE DATABASE TheDatabaseToRestore FROM DISK =N'Z:\Path\To\Backup\BackupFile'; ALTER DATABASE TheDatabaseToRestore SET MULTI_USER;
请参阅:获取使用SQL 还原SQL Server和/或还原数据库备份的独占访问权限以获取更多背景信息.
编辑: 单用户模式用于备份和恢复(在非快速版本上,我是定期使用它).使用它会启动所有其他连接,并且无法建立新连接.我没有使用各种"WITH"选项,例如"ROLLBACK IMMEDIATE",但它们的用法似乎很简单.