2011-12-27 87 views
1

如果我有关于2000 record和我做一个多重插入。哪种方法比其他方法有更好的性能?在每个单一的非查询或整个连接之前打开连接?

  • 与每个插入单元连接,并在插入后关闭。
  • 整个批量的一个连接并关闭 端的连接。在这种情况下连接超时情况如何?

注意

  • 数据库是Informix的数据库。

  • 大约需要3.5到4分钟,以插入约6000记录。(与 第一种方法)

+1

很适合我的第二个选项。每次你打算发表声明时,你都不需要打开和关闭。每个打开的连接都需要处理池的连接。使用相同的连接,你只能去池中询问连接一次 – Jorge 2011-12-27 20:45:14

回答

1

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

这就是说,我做什么遵循以下规则:

如果你可以打开一个连接,然后通过使用“使用”的语法做多的操作:

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 Framework数据提供程序时,您不必启用连接池,因为提供程序会自动管理它,尽管您可以修改某些设置。有关更多信息,请参阅SQL Server连接池(ADO.NET)。

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

1

连接的默认行为是,它被添加到池。因此,当调用Close()时,它并未真正关闭,而是刚刚释放到池中,并且在新连接上调用Open()时,会从池中选取现有的打开连接。
如果在完整插入过程中打开连接而禁用连接池,则优先于在每次插入后关闭连接。

2

我最近做了一个小修补与非常类似的情况。我有一个应用程序可以从1到任意数量的记录插入到MySQL数据库中。

为了演示(对于您自己),Magnus在他的回答中描述的连接池行为,您可以启动一个快速应用程序。随着一个按钮,在点击事件,打开(然后.close())一个到你的数据库连接,然后单击按钮“重新打开”连接后几次。 (请务必给自己一些反馈,所以你知道什么时候。开()成功(如果))。你会发现在初始连接需要几秒钟,但是当连接从池中抓住随后的尝试是非常快的。

基于我的带动想要的东西,我们最后通过动态生成一个大的INSERT语句,更多的是“全有或全无”的方法做一个“散装”插入,而不是个别的INSERT语句。有一次,我有两个版本的程序使用单独的插入,也有批量插入的方法。 对于我们的情况,我真的没有看到任何noticable性能差异。 (公平地说,有没有大量的工作正在做任)

相关问题