2011-09-16 86 views
5

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

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

  • 我试过禁用&启用连接池和摆弄连接字符串中允许的连接数和连接超时数。没有任何影响。
  • 我一直在用ADO.NET查询代替我的LINQ查询。这些旧的ADO.NET查询从不超时。只有LINQ的。
  • 我已经注意到该服务器上的其他主要性能问题,但我不确定如何通过客户的系统管理员来处理该主题。
  • 我在运行服务的应用程序服务器上具有Admin访问权限。我在他们运行Winform的终端服务器上,以及SQL服务器上都没有访问权限。

  • 是什么原因导致sp_reset_connection运行频繁?

  • 有没有办法绕过这些调用而不会将我的应用程序中的所有LINQ都撕掉?
  • 有没有办法减少这个存储过程的调用次数?
  • 有没有办法减少SQL服务器在这些调用中需要的处理器时间?
  • 如果我将pooling禁用并用空的替换那个存储的proc,我会乱七八糟吗?

回答

4

发现这一一些其他页面,一个建议是:

您的连接复位,在使用它之前打开您的DataContext的连接,并在年底关闭。

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

除非你手动打开连接(这是我从来没有真正做过的,因为它是违反直觉的),或者有一个环境事务(这是一个环境事务),它会出现数据上下文在'using'块中的每个命令之后发出'sp_reset_connection'我一直都有,所以它对我有效,我甚至没有意识到为什么)。你能给一个“其他网页”的链接?想要一些有关该行为的文档。 – GSerg

1

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

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

编辑:连接池是有原因的就删除它会likly恶化你的表现和删除“sp_reset_connection的”会给你奇怪的错误数据将结转到连接的下一个用户...

要降低sp_reset_connection的数量,唯一的办法是尝试重复使用相同的连接进行尽可能多的查询!