0

我有一个长期运行的 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()ing 有时是无操作的:SQLCommand.Prepare()

4

0 回答 0