繁体   English   中英

Linq-to-SQL和sp_reset_connection

[英]Linq-to-SQL and sp_reset_connection

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

我发现在负载下捕获10分钟的过程中, sp_reset_connection占SQL SQL总持续时间的三分之一,占SQL总调用的90%。

  • 我尝试禁用和启用连接池,并摆弄连接字符串中允许的连接数和连接超时。 没有任何作用。
  • 遇到它们时,我一直用ADO.NET查询替换LINQ查询。 这些旧的ADO.NET查询永远不会超时。 只有LINQ的。
  • 我已经注意到该服务器上的其他主要性能问题,但是我不确定如何使用客户的sysadmin解决此问题。
  • 我在运行该服务的应用程序服务器上具有管理员访问权限。 我几乎无法访问运行Winform的终端服务器,也无法访问SQL服务器。

  • 是什么导致sp_reset_connection如此频繁地运行?

  • 有没有办法避免将所有LINQ从我的应用程序中删除,从而规避这些调用?
  • 有没有办法减少对此存储过程的调用次数?
  • 有没有一种方法可以减少SQL Server进行这些调用所需的处理器时间?
  • 如果我禁用池化功能,并将存储的过程替换为一个空的过程,是否还会搞砸其他事情?

找到了其他有关此的页面,其中一个建议如下:

为了重置连接,请先使用DataContext连接,然后再使用它,最后将其关闭。

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

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

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

编辑:由于存在连接池,将其删除是有原因的,它会大大降低性能,而删除“ sp_reset_connection”将给您带来怪异的错误,因为数据将被传递给连接的下一个用户...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM