如果我有2000 record
,我会进行多次插入。哪种方法比另一种方法有更好的性能?
备注:
数据库是informix db。
插入约6000条记录大约需要3.5到4分钟 第一种方法)
答案 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连接,其他源的内置连接提供程序也会以类似的方式运行。