ADO.NET中的连接生存期和预准备语句

时间:2012-10-14 20:33:25

标签: c# sql-server ado.net

我有一个长期运行的Windows服务,它不断接收数据并对其进行处理,然后将其放入数据库。我使用存储过程进行复杂操作,但其中一些有很多参数。

我知道这是建议的“最佳做法”:

using(IDbConnection connection = GetConnection())
{
   connection.Open();
   // Do stuff
   connection.Close();
}

导致短暂的连接,但充分利用连接池。但是,这种做法实际上似乎否定了存储过程的好处。我现在有这样的事情:

while(true) 
{ 
  var items = GetData(); // network I/O
  using(IDbConnection conn = GetConn()) 
  {
    connection.Open();
    var tran = connection.BeginTransaction();
    var preparedStatement1 = SQL.Prepare(connection, "...", ...);
    var preparedStatement2 = SQL.Prepare(connection, "...", ...);
    var preparedStatement3 = SQL.Prepare(connection, "...", ...);

    foreach(var item in items) 
    {
      // loop which calls SQL statements.
    }
    connection.Close();
  }
}

我真的觉得我应该在while循环之外打开连接,这样它就能保持很长时间;并在进入循环之前准备语句。这将为我提供使用存储过程的全部好处:

using(IDbConnection conn = GetConn()) 
{
  connection.Open();
  var tran = connection.BeginTransaction();
  var preparedStatement1 = SQL.Prepare(connection, "...", ...);
  var preparedStatement2 = SQL.Prepare(connection, "...", ...);
  var preparedStatement3 = SQL.Prepare(connection, "...", ...);

  while(!service.IsStopped) 
  { 
    var items = GetData(); // network I/O  
    foreach(var item in items) 
    {
      // loop which calls SQL statements.
    }      
  }
  connection.Close();
}

所以问题是,存储过程的性能优势是否超过了长时间保持连接打开的“风险”?最好的做法似乎从来没有提到准备好的语句,MSDN文档(我使用的是SQL Server)似乎建议Prepare()有时候会成为无操作:SQLCommand.Prepare()

0 个答案:

没有答案