禁用sp_reset_connection

时间:2011-10-28 09:15:53

标签: .net sql-server ado.net connection-pooling

由于我遇到的一些问题,我正在尝试.NET Framework 4中的连接池。使用SQL Profiler,我可以看到每次从连接池中获取连接时,都会执行存储过程sp_reset_connection。

要摆脱这种重置(我实际上不需要sp_reset_connection)。我已经尝试将连接字符串中的连接重置参数设置为false,但这似乎没有任何效果。我在想,也许我误解了Connection reset参数的用途。

我注意到http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx没有记录Connection reset参数。但在许多其他地方也提到过,例如http://www.techrepublic.com/article/educate-yourself-about-net-sql-server-connection-string-syntax/6084879

如果我将Conection Reset标志设置为无效值(例如'hello'),则在打开连接时会出现异常,表明实际使用了连接重置标志。

ADO.NET是否真的关心连接重置标志?

我的代码如下:

  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);
        }
     }
  }

1 个答案:

答案 0 :(得分:6)

SqlClient确实验证了Connection Reset标志(它必须可以转换为布尔值)。但是从.NET 3.5 SP1开始,值被忽略

此外,SqlConnectionStringBuilder.ConnectionReset property在.NET 3.5 SP1中已过时。

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

设置Connection Reset = false的唯一好处是可以提高SQL Server 7.0的性能,避免往返。

Connection Reset记录在.NET 3.0 docs中。我认为它从3.5 SP1文档中删除的原因是后来因为它现在什么也没做。