代码之家  ›  专栏  ›  技术社区  ›  Mr. Flibble

是否可以重新创建许多SQL连接(SQL 2008)

  •  2
  • Mr. Flibble  · 技术社区  · 14 年前

    using (var connection = new SqlConnection(connStr))
    {
      connection.Open();
      foreach (var item in items)
      {
         var cmd = new SqlCommand("INSERT ...")
         cmd.ExecuteNonQuery();
      }
    }
    

    我现在想要切分数据库,因此需要根据插入的项选择连接字符串。这会使我的代码运行得更像这样

    foreach (var item in items)
    {
      connStr = GetConnectionString(item);
      using (var connection = new SqlConnection(connStr))
      {
        connection.Open();      
        var cmd = new SqlCommand("INSERT ...")
        cmd.ExecuteNonQuery();
      }
    }
    

    这基本上意味着它正在为每个项目创建一个到数据库的新连接。这会起作用吗?还是为每个插入重新创建连接会导致可怕的开销?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Community ƒernando Valle    4 年前

    我猜你说的是C#/.NET。在这种情况下,连接是由框架汇集的,因此以这种方式创建连接的开销并没有那么高。

    正如@TomTom所指出的,还应该考虑事务。如果要插入同一服务器上的不同数据库,可以使用普通的SQL事务。如果数据库位于不同的服务器上,则需要使用MSDTC事务跨数据库服务器协调它们。无论如何,处理事务的最佳方法是将相关代码包装到TransactionScope中。这与打开和关闭(实际上是从池中重用)数据库连接没有冲突。

    using(new TransactionScope())
    {
        // Update code to various databases, opening and closing connections.
    }
    

    对于SQL2005或更新版本,TransactionScope将首先默认为SQL事务,然后根据需要自动将其升级为MSDTC事务。

        2
  •  1
  •   TomTom    14 年前

    也就是说,如果您为每个插入打开一个新连接,那么您的事务边界就会遇到严重的问题。更复杂的更新需要归入一个事务。而yoyu可以把它包装在一个系统事务名称空间中。。。 …这将意味着所有的连接在提交之前都将保持打开状态,使用了大量的连接,这将迫使MSDTC(分布式事务协调器)介入,并承担所有的开销。

        3
  •  1
  •   Martin Smith    14 年前

    除了其他海报的观点之外,你说的图案是你通常的风格让我想起了我刚刚读到的一些东西。

    http://research.microsoft.com/apps/pubs/?id=76507

    2.3确定批量操作的机会

    应用程序正在将数据插入 表格:

    for (int i=0;i<MAXVALUE;i++) {
    // execute SQL statement INSERT INTO T VALUES(...)
    }
    

    每次都是低效的 INSERT语句的循环是 执行。一种更有效的方法 批量插入数据访问API 层,利用 配料。注意配料 为了确定这个问题 执行特定的SQL语句 在一个循环中重复,并且 实例实际上是一个INSERT 表T上的语句。那就是了 信息一起建议 映射到大容量插入API。

    在ADO.NET2.0中,我认为这意味着使用 SqlBulkCopy