相关疑难解决方法(0)

如何解决“当会话处于单用户模式时客户端驱动程序发送了多个请求”

我正在与一位正在努力阻止以下错误的开发人员合作:

服务器将断开连接,因为客户端驱动程序在会话处于单用户模式时发送了多个请求。当客户端在会话中仍有批处理运行时发送重置连接的请求,或者当会话正在重置连接时客户端发送请求时,会发生此错误。请联系客户端驱动程序供应商。

发生此错误时,典型的结果是会话持有锁,但没有运行 SQL(sys.dm_exec_requestssession_id没有行),并导致阻塞,直到它被终止。阻塞的原因很简单,但如何阻止错误发生却不是。

关于这个问题的一些事实:

  • 客户端正在使用实体框架(是的,我知道...),启用了 MARS(是的,我知道...)
  • SQL Server 版本为 10.00.5844(SQL Server 2008 SP3 CU12)。他们可能不会在没有广泛测试的情况下升级主要版本,但应用更新的 CU 是可行的。
  • 客户端程序显示sys.dm_exec_connections为 .Net SqlClient Data Provider
  • 开放连接似乎肯定有MARS启用,如net_transportsys.dm_exec_connections表演Session
  • 我被告知应用程序的连接字符串已启用异步处理,根据Matt Neerincx线程中评论(我无权访问应用程序服务器来确认这一点):

如果在连接字符串上设置 Async=true ,它应该可以防止出现此问题。如果您正在使用 MARS 并在多个并发线程上使用相同的连接,则可能发生的情况是重置连接的调用可能会稍微延迟并触发此错误。如果您设置 Async=true,我们会在客户端驱动程序中执行额外的锁定以防止这种情况发生。

关于此错误的更多信息很少。这似乎表明客户端的程序sp_reset_connection在批处理仍在运行时正在调用。我可以设置一个跟踪来确认这一点,但我必须记录很多不相关的活动,而且问题每隔几天才会发生一次。此外,我不确定开发人员是否能够利用这些证据来解决问题。

作为 DBA 或系统管理员,我是否可以使用任何其他技术来进一步解决此问题,或者我可以向开发人员提出任何可能为他提供有用信息或使问题不太可能发生的建议?

sql-server entity-framework

7
推荐指数
1
解决办法
8699
查看次数

标签 统计

entity-framework ×1

sql-server ×1