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

可以重新创建许多SQL连接吗(SQL 2008),sql,database-design,database-connection,sharding,database-partitioning,Sql,Database Design,Database Connection,Sharding,Database Partitioning,在数据库中执行多次插入时,我通常会有如下代码: using (var connection = new SqlConnection(connStr)) { connection.Open(); foreach (var item in items) { var cmd = new SqlCommand("INSERT ...") cmd.ExecuteNonQuery(); } } 现在我想对数据库进行分片,因此需要根据插入的项选择连接字符串。这将使我的代码

在数据库中执行多次插入时,我通常会有如下代码:

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

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

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

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

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

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

我假设您谈论的是C/.NET。在这种情况下,连接是由框架汇集的,因此以这种方式创建连接的开销并不高

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

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

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

理论上,可以创建任意数量的连接。重新创建连接很快,除非强制使用非连接池。按照标准,SQL连接不会关闭,而是放入池中两分钟,iirc用于重用

也就是说,如果您为每次插入打开一个新连接,那么您的事务边界就会遇到严重问题。更复杂的更新需要属于一个事务。而yoyu可以将其包装在System.Transaction命名空间下。。。 …这意味着所有连接都将保持打开状态,直到提交为止,使用了大量连接,这将迫使MSDTC分布式事务协调器介入,并带来所有开销


因此,从体系结构的角度来看,重用连接更为可取,因为您的事务行为基本上处于死胡同,而不是连接数。

理论上,创建尽可能多的连接是可以的。重新创建连接很快,除非强制使用非连接池。按照标准,SQL连接不会关闭,而是放入池中两分钟,iirc用于重用

也就是说,如果您为每次插入打开一个新连接,那么您的事务边界就会遇到严重问题。更复杂的更新需要属于一个事务。而yoyu可以将其包装在System.Transaction命名空间下。。。 …这意味着所有连接都将保持打开状态,直到提交为止,使用了大量连接,这将迫使MSDTC分布式事务协调器介入,并带来所有开销


因此,从体系结构的角度来看,重用连接更为可取,因为您的事务行为基本上处于死胡同,而不是连接计数。

除了其他海报的观点之外,您所说的模式是您通常的风格,这让我想起了我刚刚读到的一些东西

2.3确定批量作业的机会

考虑应用程序中的一个循环 代码,如下所示,其中 应用程序正在将数据插入到 表:

如上所述,代码是 由于每次都通过,效率低下 INSERT语句的循环是 执行。一种更有效的方法 达到同样的效果是使用 数据访问的批量插入API 层,它利用了 配料。注意,这些成分 用于识别此问题的 应用程序上下文 执行特定的SQL语句 在一个循环内重复,并且 数据库上下文要知道每个 实例实际上是一个INSERT 表T上的语句。然后是 可以把这些碎片 将信息整合在一起,以建议 映射到批量 插入API


在ADO.NET 2.0中,我认为这意味着除了使用其他海报的观点外,还要使用SqlBulkCopy。你说的模式是你通常的风格,这让我想起了我刚刚读到的一些东西

2.3确定批量作业的机会

考虑应用程序中的一个循环 代码,如下所示,其中 应用程序正在将数据插入到 表:

如上所述,代码是 由于每次都通过,效率低下 INSERT语句的循环是 执行。一种更有效的方法 达到同样的效果是使用 数据访问的批量插入API 层,它利用了 配料。注意,这些成分 用于识别此问题的 应用程序上下文 执行特定的SQL语句 在一个循环内重复,并且 数据库上下文要知道每个 实例实际上是一个INSERT 表T上的语句。然后是 可以把这些碎片 将信息整合在一起,以建议 映射到批量插入API


在ADO.NET 2.0中,我认为这意味着使用SqlBulkCopy

-1没有看到事务边界的潜在问题以及这一问题真的爆发的事实。-1没有看到事务边界的潜在问题以及这一问题真的爆发的事实。Ok。sql命令是简单的插入,通常插入只发生在一个线程中,因此我想事务边界对我来说不是问题。实际上,它们是您有多个插入的时刻,应该是事务的一部分。类似于插入发票,然后是ihnsert InvoiceDetail调用。所有这些都属于一个逻辑事务。使用您的方法和System.Transaction,包含20个发票项目的发票将保持并阻止21个数据库连接。这是一个被解雇的架构级别。好的。sql命令是简单的插入,通常插入只发生在一个线程中,因此我想事务边界对我来说不是问题。实际上,它们是您有多个插入的时刻,应该是事务的一部分。类似于插入发票,然后是ihnsert InvoiceDetail调用。所有这些都属于一个逻辑事务。使用您的方法和System.Transaction,包含20个发票项目的发票将保持并阻止21个数据库连接。这是一个被解雇的架构级别。