65.9K
CodeProject 正在变化。 阅读更多。
Home

将 ASP.NET 应用迁移到容器 #1 – 多个活动结果集

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2024 年 2 月 23 日

CPOL

2分钟阅读

viewsIcon

6351

将 ASP.NET 应用移植到 Docker Linux 容器后,连接数据库时遇到的主要问题之一。

引言

在最近的一个项目中,需要将托管在 Windows 上的现有 ASP.NET 应用迁移到 Linux Docker 容器。 在整个迁移过程中,出现了许多挑战,并且花费了大量时间进行迁移。 在本文以及后续标题类似的帖子中,我将简要概述遇到的关键挑战。 首先,我将解决持续时间最长的挑战:多个活动结果集!

简而言之

在部署到 Linux 时,切勿在连接字符串中启用“多个活动结果集 (MARS)”配置。

详细说明

在将其中一个高流量 ASP.NET Windows 应用程序迁移到 Linux 时,我们遇到一个非常不寻常的问题,之前从未经历过。 它涉及数据库操作期间随机发生的重大延迟、超时,甚至 TPC 重置。 在几个通用异常中,最常收到的异常之一是

Microsoft.Data.SqlClient.SqlException: Execution Timeout Expired.  
The timeout period elapsed prior to completion of the operation or the server 
is not responding.
 ---> System.ComponentModel.Win32Exception (258): Unknown error 258

经过数周的部署、回滚、与网络团队的会议以及探索内存和 TCP 转储后,我们发现了一个救星 GitHub issue,它准确地描述了我们面临的问题。 猜猜怎么了……问题最终变成了我们连接字符串中的“MultipleActiveResultSets=True”设置! 奇迹般的是,删除 MARS 设置后,一切都落入到位并开始无缝工作!

即使您的代码未使用 MARS 设置,在 Linux 部署中仍然可能受到其影响。 减少查询的并行性也没有帮助! 因此,底线是,尽可能**避免在 Linux 上使用 MARS**。

幸运的是,我们能够处理依赖于此设置的逻辑,并且这场致命的战斗终于结束了。 再次感谢上述 GitHub issue 以及所有分享知识的人,我们让事情正常运行并解决了问题。
祝您愉快!

历史

  • 2024 年 2 月 23 日:初始版本
© . All rights reserved.