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

时间:2011-12-27 20:42:14

标签: c# asp.net performance connection informix

如果我有2000 record,我会进行多次插入。哪种方法比另一种方法有更好的性能?

  • 连接每个插入。并在插入后关闭。
  • 整个批量的一个连接并关闭连接 结束。那么在这种情况下连接超时呢。

备注

  • 数据库是informix db。

  • 插入约6000条记录大约需要3.5到4分钟 第一种方法)

3 个答案:

答案 0 :(得分:2)

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

为了演示(对你自己),Magnus在他的回答中描述的连接池行为,你可以启动一个快速的应用程序。使用按钮并在单击事件上,打开(然后.close())与数据库的连接,然后单击按钮以在此之后“重新打开”连接几次。 (确保给自己一些反馈,以便了解。(以及).open()何时成功。)您会注意到初始连接需要几秒钟,但是当从池中获取连接时,后续尝试非常快。

基于我的主管想要的内容,我们最终通过动态生成一个大插入语句来进行“批量”插入,更多的是“全有或全无”方法,而不是单独的插入语句。有一次,我有两个版本的程序使用单独的插入,以及批量插入方法。 对于我们的情况 ,我没有看到任何明显的性能差异。 (公平地说,没有大量工作要做)

答案 1 :(得分:1)

连接的默认行为是将其添加到池中。因此,当被调用的Close()未真正关闭但刚刚释放到池中并且在新连接上调用Open()时,将从池中选择现有的打开连接。
如果汇集禁用在完成插入期间打开连接,在每次插入后关闭它。

答案 2 :(得分:1)

应用程序连接池将在很大程度上使这个问题无关紧要,因为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

要部署高性能应用程序,必须使用连接池。当您使用.NET Framework数据提供程序用于SQL Server时,您不必启用连接池,因为提供程序会自动管理它,尽管您可以修改某些设置。有关详细信息,请参阅SQL Server连接池(ADO.NET)。

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