在每个非查询之前打开连接,或者在整个连接之前打开连接

本文关键字:连接 或者 查询 | 更新日期: 2023-09-27 18:18:57

如果我有大约2000 record,我做了多次插入。哪一种方法比另一种方法性能更好?

  • 每次插入连接,插入后关闭。
  • 为整个批量创建一个连接,并在结束。在这种情况下,连接超时怎么办?

注释:

  • 数据库为informix db.

  • 插入6000条记录大约需要3.5 ~ 4分钟。(第一个方法)

在每个非查询之前打开连接,或者在整个连接之前打开连接

我最近对一个非常类似的情况做了一些修补。我有一个应用程序,可以在MySQL数据库中插入1到几千条记录。

为了(向您自己)演示Magnus在他的回答中描述的连接池行为,您可以快速构建一个应用程序。使用按钮并在click事件上打开(然后.close())到数据库的连接,然后单击按钮以"重新打开"连接几次。(确保给自己一些反馈,这样你就知道何时(以及是否).open()成功了。)您会注意到初始连接需要几秒钟,但是当从池中抓取连接时,随后的尝试非常快。

根据我的领导想要的,我们最终通过动态生成一个大的插入语句来做一个"批量"插入,更多的是"全有或全无"的方法,而不是单独的插入语句。有一段时间,我有两个版本的程序,分别使用单个插入和批量插入方法。对于我们的情况,我没有看到任何明显的性能差异。(公平地说,也没有很多工作要做)

应用程序连接池将在很大程度上使这个问题无关紧要,因为c#应用程序池针对对同一数据库的多次调用进行了优化。

也就是说,我所做的符合以下规则:

如果您可以打开一个连接,然后使用"using"语法执行多个操作:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    // Do work here; connection closed on following line.
}

然后保持连接打开并执行所有操作。

但是,如果每条记录都被操作,然后以这样一种方式保存,您必须在每个点打开一个新的连接,不要担心太多。使用连接池,您仍然可以执行得很好。

从MSDN:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

要部署高性能应用程序,必须使用连接池。当你为SQL Server使用。net框架数据提供程序时,你不需要启用连接池,因为提供程序会自动管理连接池,尽管你可以修改一些设置。有关更多信息,请参见SQL Server连接池(ADO.NET)。

即使您的连接不是SQL连接,其他源的内置连接提供程序也以类似的方式运行。

连接的默认行为是将其添加到池中。因此,当Close() in被调用时,它并不是真正关闭,而是释放到池中,当Open()在一个新连接上被调用时,从池中选择一个现有的打开连接。
如果池被禁用,在完成插入期间有一个打开的连接比在每次插入后关闭它更可取。

相关文章: