c# – 记住.net中的SQL连接状态?
除了旧的已知事实,connection.Close()vs connection.Dispose()是相同的 – 除了在已关闭的连接上运行Close()时在已处置的连接上运行Close()引发异常 – 是的 – 我还有一个问题 :
假设连接池已打开,(默认) – 为什么记住连接状态很重要? 我已阅读this question here,其中显示 – 避免打开和关闭连接可以节省性能. 这似乎是逻辑,但问题是连接永远不会被关闭!它只标记为关闭. 即使我在使用范围内使用它 – dispose只是关闭连接并将其放回池中. 即使我想要,我也不能让它开放(因为我希望其他人使用它).所以我不得不关闭/处理它. Looking at Dapper也实现了这种行为: public static async Task<IEnumerable<T>> QueryAsync<T>(this...) { //... bool wasClosed = cnn.State == ConnectionState.Closed; using (var cmd = (DbCommand)command.SetupCommand(cnn,info.ParamReader)) { try { if (wasClosed) await ((DbConnection)cnn).OpenAsync()... //... } finally { if (wasClosed) cnn.Close(); } } } 正如您所看到的,“记忆”在这里实现. 嗯,我已经向Marc询问了一个相关的话题 – 为什么在dapper样本中他同时使用GetClosedConneciton和GetOpenConnection,我得到了一个答案,即Dapper可以处理这两种情况.然而,当前的问题是关于为什么重新设置连接状态. 题 : 看看Dapper代码,它似乎记得状态并在操作后重新设置状态. (我也从旧的sqldataadapter类知道这种行为) 问题是 – 为什么?如果我有一个封闭的连接 – 那么,我需要打开它.大.但为什么我必须按条件关闭呢?为什么不总是关闭它?它不会损害性能,因为连接实际上并未关闭 – 它只返回池中. 反过来 – 如果我有一个开放的连接,那么我会工作并保持打开(呵呵??) 你可能已经看到了,我在这里遗漏了一些东西.有人可以光明吗? 解决方法
用户可能正在对该连接进行大量工作.它可能与一个事务相关联(关闭它会孤立它).它可能有临时表(关闭会破坏它们),或其他连接保留状态(SET选项,模拟等). 在这里关闭连接(如果它最初打开)将是一个不寻常和意想不到的事情,有多个令人讨厌的副作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |