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

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

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

备注

  • 数据库是informix db。

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

应用程序连接池将在很大程度上使这个问题无关紧要,因为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连接,其他源的内置连接提供程序也以类似的方式运行。

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

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

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

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