Linq-to-sql上下文数据库连接处理

时间:2011-09-20 16:09:31

标签: c# .net linq-to-sql

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如何处理连接的详细文档?

4 个答案:

答案 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)

我认为在这种情况下你不需要额外的交易。