在每个非查询之前打开连接,或者在整个连接之前打开连接
本文关键字:连接 或者 查询 | 更新日期: 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()
在一个新连接上被调用时,从池中选择一个现有的打开连接。
如果池被禁用,在完成插入期间有一个打开的连接比在每次插入后关闭它更可取。