我意识到这可能是一个太笼统的问题,但我的挫败感促使我提出这个问题。我正在开发一个使用实体框架与数据库通信的 Blazor 服务器应用程序。
我发现该应用程序会立即使网络服务器崩溃。如果 EF 代码出现任何问题——通常在触发某种并发问题时保存到 DB——整个 Web 服务器就会死掉并且无法恢复。这是最后一个让我发布消息的原因。如果崩溃很容易恢复,我可以处理它们,但是必须重新启动整个服务器以恢复功能,然后在几分钟后再次崩溃会降低我的工作效率。
例如,如果我有下面的代码,其中 SaveChanges 发生在 UpdateAppVersions 内,我将触发与在 ForEach 循环中保存更改相关的 EF 问题。
我想问的是为什么这会使服务器严重崩溃我不得不重启机器?
foreach (var app in UpdateList)
{
UpdateAppVersion(app.App_ID, ComputerID, app.Version);
}
_context.SaveChanges();
为什么 EF 故障可能导致 Web 服务器严重崩溃,以至于在不重新启动整个服务器的情况下无法恢复?
明确地说,我的第一反应是尝试重新启动应用程序池这有时有效,有时则无效。
我的下一个反应是停止并启动 Web 服务器。这很少奏效。
最后我不得不求助于完全重启服务器。这太疯狂了!
那么这里发生了什么?我认为这些失败中的每一个都是因为我不理解在 DB 上下文上调用 SaveChanges 不是我们应该经常做的事情,因为它会导致错误,系统声称同时发生了太多事情(System.Data .SqlClient.SqlException:不允许新事务,因为会话中还有其他线程在运行。)
我知道在那种情况下该怎么做,但为什么它会如此严重地导致服务器崩溃?这使得调试变得更加困难,因为调试周期有时需要完全重启服务器,这需要几分钟甚至更长的时间。
它也会在事件日志中没有任何可见错误的情况下崩溃,而且更难追踪,因为我现在没有得到任何提示。我在事件日志中看到了帮助我追踪并发类型问题的消息,现在我一无所获,但服务器一直在崩溃。
有人可以在这里提供任何建议吗?如果我能防止 Web 服务器严重崩溃,我就可以更快地进行调试。