Linq-to-SQL和sp_reset_connection

时间:2011-09-16 07:09:42

标签: c# sql linq-to-sql query-optimization connection-pooling

我有一个.NET 4.0 Winform和一个.NET 4.0 Windows服务,它们都通过LINQ to SQL连接到SQL 2005/2008数据库。它在我们的测试环境中运行良好且快速,完美克隆生产数据,但在生产环境中,它运行速度非常慢,CPU使用率和带宽使用率也很低。我还注意到每天有数百个SQL超时,即使对于索引良好的数据库上的最小查询也是如此。所以我启动了Profiler ......

我发现 sp_reset_connection 在占用的10分钟内捕获期间占SQL SQL持续时间总量的三分之一和占所有SQL调用总数的90%。

  • 我试过禁用&启用连接池并摆弄连接字符串中允许的连接数和连接超时数。没有任何影响。
  • 当我遇到它时,我一直用ADO.NET查询替换我的LINQ查询。这些旧的ADO.NET查询永远不会超时。只有LINQ的。
  • 我注意到该服务器上存在其他主要性能问题,但我不确定如何使用客户的系统管理员来处理该主题。
  • 我在运行服务的应用服务器上拥有管理员权限。我在他们运行Winform的终端服务器上没有访问权限,也没有访问SQL服务器。

  • 是什么导致 sp_reset_connection 经常运行?

  • 有没有办法绕过这些调用而不会撕掉我的应用程序中的所有LINQ?
  • 有没有办法减少对此存储过程的调用次数?
  • 有没有办法减少SQL服务器对这些调用所需的处理器时间?
  • 如果我将游泳池禁用并用例如空的替换存储过程,我是否会搞乱其他任何事情?

2 个答案:

答案 0 :(得分:4)

发现了一些关于此的其他网页,其中一个建议:

对于连接重置,请在使用之前打开DataContext连接,并在结束时将其关闭。

db.Connection.Open()
... work...
db.Connection.Close()

答案 1 :(得分:1)

当sqlconnection返回到连接池时发生sp_reset_connection,现在这应该不是问题。

但现在的问题是为什么你会超时?是sql服务器无法处理事务量,还是连接池耗尽,从未使用Linq-to-sql,但要确保在处理完对象后处理掉所有可以处理的东西......

编辑:连接池存在的原因是它删除它会使你的性能恶化并删除“sp_reset_connection”会给你带来奇怪的错误,因为数据将被转移到连接的下一个用户......

要降低sp_reset_connection的数量,你可以做的唯一方法就是尝试为尽可能多的查询重用相同的连接!