禁用sp_reset_connection

4
由于我遇到了一些问题,我在.NET Framework 4中进行连接池实验。使用SQL Profiler,我可以看到每次从连接池中获取连接时都会执行存储过程sp_reset_connection。
为了摆脱这个重置(实际上我不需要sp_reset_connection),我尝试将连接字符串中的Connection Reset参数设置为false,但是这似乎没有任何效果。我认为可能是我误解了Connection reset参数的作用。
我注意到连接重置参数在http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx中没有记录。但是它在许多其他地方提到,例如http://www.techrepublic.com/article/educate-yourself-about-net-sql-server-connection-string-syntax/6084879
如果我将Connection Reset标志设置为无效值(例如'hello'),那么在打开连接时就会引发异常,表明Connection Reset标志实际上被使用。
ADO.NET是否真正关心Connection reset标志?
以下是我的代码:
  static void Main(string[] args)
  {
     const string connectionString =
        "Data Source=(local);Initial Catalog=MyDatabse;User ID=sa;Password=<removed>;Connection Timeout=5;Pooling=true;Min Pool Size=1; Max Pool Size=1; Enlist=false; Connection Reset=false;";

     var connections = new List<SqlConnection>();
     for (int i = 0; i < 1000000; i++)
     {
        using (var conn = new SqlConnection(connectionString))
        {
           conn.Open();

           SqlCommand command = new SqlCommand("SELECT * FROM DatabaseVersion", conn);
           command.ExecuteNonQuery();

           connections.Add(conn);
        }
     }
  }

4
为什么不像其他人一样就让它保持原样呢?这不是你的问题:可以寻求关于那个问题的帮助。顺便说一下,它确实有很多用处:https://dev59.com/gnRB5IYBdhLWcg3wZWXi#2924456 - gbn
我同意 gbn 的观点。你认为 sp_reset_connection 没有必要的原因是什么? - Jared Moore
1个回答

6

SqlClient验证连接重置标志(必须可以转换为布尔值)。但是自.NET 3.5 SP1以来,该值被忽略

此外,在.NET 3.5 SP1中,SqlConnectionStringBuilder.ConnectionReset属性已被弃用。

原因是设置连接重置=false是一个巨大的安全漏洞-它可以允许重用与其关联的具有敏感元素的会话,例如打开的对称密钥、临时密钥或模拟上下文。此外,它可能已经执行了ChangeDatabase到另一个数据库,因此当您重新打开它时,它将连接到“错误”的数据库。

连接重置=false的唯一好处是在SQL Server 7.0上提高性能,因为避免了往返。

连接重置.NET 3.0文档中有记录。我认为它从3.5 SP1文档和之后的文档中删除的原因是因为现在它什么都不做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接