linq-to-sql datacontext如何保持数据库连接打开的规则是什么?
当我们对每个更新实体的一个SubmitChanges()
而不是整个批次实体的一个SubmitChanges()
进行一些性能测试时,问题出现了。结果:
在一个SubmitChanges()调用中插入3000个项目......持续时间:1318ms
在一个SubmitChanges()调用中插入3000个项目 transactionscope ...持续时间:1280ms
在各个SubmitChanges()调用中插入3000个项目......持续时间: 4377ms
在a中的单个SubmitChanges()调用中插入3000个项目 交易...时长:2901ms
请注意,为每个更改的实体执行单独的SubmitChanges()
时,将事务中的所有内容都提高性能,这对我们来说非常意外。在sql server profiler中,我们可以看到事务中的各个SubmitChanges()
调用不会为每次调用重置数据库连接,而不是没有事务的调用。
数据上下文在什么情况下保持连接打开?是否有关于linq-to-sql如何处理连接的详细文档?
答案 0 :(得分:3)
你没有展示整个画面;默认情况下,LINQ-to-SQL将在事务中包装对SubmitChanges
的调用。如果你用另一个事务包装它,那么你将看不到连接重置;直到所有的SubmitChanges
次调用完成后才能提交外部事务。
答案 1 :(得分:3)
除了打开/关闭连接之外,可能还有许多因素会影响时间。
编辑:在了解了linq2sql如何分别管理缓存实体和脏实体后,我删除了有关被跟踪实体的位。
通过使用Reflector或其他反汇编程序来检查SqlConnectionManager类上的方法,您可以很好地了解如何管理连接。如果提交在其自己的事务中包装提交,则SubmitChanges将在其提交后在其IProvider(通常是SqlProvider,然后使用SqlConnectionManager)上调用ClearConnection,但如果SubmitChanges是更大事务的一部分则不会。打开和关闭连接取决于是否有其他活动使用SqlConnectionManager。
答案 2 :(得分:0)
我最近也搞砸了。调用SubmitChanges
3000次不是一个好主意,但是根据每个记录插入的重要程度,你可能想要这样做,毕竟只需要1000毫秒。
交易范围和多个SubmitChanges
是我期望看到的。由于你仍然在一个事务中,我希望看到SQL服务器处理这个更好,这似乎。一个SubmitChanges
并使用显式/隐式TransactionScope
似乎产生相同的结果,这是预期的。那里应该没有任何/很多性能差异。
我认为连接是在需要时创建的,但你必须记住这将在你的提供者中汇集,所以除非你的连接字符串正在改变,你应该挂钩到同一个连接池,这将产生无论采用何种方法,性由于LINQ-SQL在幕后使用SqlConnection
,因此有关它的一些信息如下:
http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.80).aspx
如果您的强力演出后,请查看进入存储过程,以便使用明确的TransactionScope
进行插入。如果这还不够快,请查看使用SqlBulkCopy
。 3000行应插入超过1000毫秒。
答案 3 :(得分:0)
您是否尝试过自己打开并关闭连接: Force the Opening of the DataContext's Connection (LINQ)
我认为在这种情况下你不需要额外的交易。