我有一个.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%。
我在运行服务的应用服务器上拥有管理员权限。我在他们运行Winform的终端服务器上没有访问权限,也没有访问SQL服务器。
是什么导致 sp_reset_connection 经常运行?
答案 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的数量,你可以做的唯一方法就是尝试为尽可能多的查询重用相同的连接!