加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 记住.net中的SQL连接状态?

发布时间:2020-12-16 00:11:11 所属栏目:百科 来源:网络整理
导读:除了旧的已知事实,connection.Close()vs connection.Dispose()是相同的 – 除了在已关闭的连接上运行Close()时在已处置的连接上运行Close()引发异常 – 是的 – 我还有一个问题 : 假设连接池已打开,(默认) – 为什么记住连接状态很重要? 我已阅读 this que
除了旧的已知事实,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类知道这种行为)

问题是 – 为什么?如果我有一个封闭的连接 – 那么,我需要打开它.大.但为什么我必须按条件关闭呢?为什么不总是关闭它?它不会损害性能,因为连接实际上并未关闭 – 它只返回池中.

反过来 – 如果我有一个开放的连接,那么我会工作并保持打开(呵呵??)

你可能已经看到了,我在这里遗漏了一些东西.有人可以光明吗?

解决方法

why not ALWAYS close it ?

用户可能正在对该连接进行大量工作.它可能与一个事务相关联(关闭它会孤立它).它可能有临时表(关闭会破坏它们),或其他连接保留状态(SET选项,模拟等).

在这里关闭连接(如果它最初打开)将是一个不寻常和意想不到的事情,有多个令人讨厌的副作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读