我有一个使用 MVC/EF Code First 编程的应用程序。它做了很多服务器端处理,并且非常耗费资源。
我知道如何设置负载平衡,但是,我想知道扩展 EF 应用程序是否像配置新服务器、部署应用程序和指向数据库集群一样简单 - 或者我将面临任何问题多个 EF 应用程序访问同一个数据库服务器?
我似乎找不到任何建议/指南,我担心我选择了 EF 而不是更简单/更直接的东西,我做出了错误的选择!
我有一个使用 MVC/EF Code First 编程的应用程序。它做了很多服务器端处理,并且非常耗费资源。
我知道如何设置负载平衡,但是,我想知道扩展 EF 应用程序是否像配置新服务器、部署应用程序和指向数据库集群一样简单 - 或者我将面临任何问题多个 EF 应用程序访问同一个数据库服务器?
我似乎找不到任何建议/指南,我担心我选择了 EF 而不是更简单/更直接的东西,我做出了错误的选择!
...问题...关于多个 EF 应用程序访问同一个数据库服务器?
回顾一下您的应用程序是基于 ASP .NET MVC 的应用程序这一事实。拥有多个实例可能会引发状态管理的幽灵。
MSDN 很好地介绍了为什么这是一个问题:
HTTP 是一种无状态协议。这意味着 Web 服务器将页面的每个 HTTP 请求视为一个独立的请求。服务器不保留先前请求期间使用的变量值的知识。ASP.NET 会话状态将在有限时间窗口内来自同一浏览器的请求标识为会话,并提供一种在该会话期间保持变量值的方法。默认情况下,为所有 ASP.NET 应用程序启用 ASP.NET 会话状态。
会话状态的替代方案包括:
- 应用程序状态,它存储可由 ASP.NET 应用程序的所有用户访问的变量。
这一点是一种非常常见的存储状态的方式,但是当涉及到应用程序的多个实例时(状态仅对其中一个实例“可见”)就会失效。
通常,这可以通过使用StateServer
或的SQLServer
值来解决SessionStateMode
。同一篇文章对每个选项进行了很好的总结(强调我的)。
StateServer
模式,它将会话状态存储在称为 ASP.NET 状态服务的单独进程中。这可确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于 Web 场中的多个 Web 服务器。
SQLServer
模式将会话状态存储在 SQL Server 数据库中。这可确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于 Web 场中的多个 Web 服务器。
如果您的应用程序是无状态的,这是一个有争议的问题。
我担心我选择 EF 做出了错误的选择
至于您的应用程序访问数据库的多个实例的问题,您将遇到任何类型的数据访问技术的问题。
这是基本场景:假设您的应用程序按计划向用户发送欢迎电子邮件。
给定表格Users
:
UserId | Email | WelcomeLetterSent
-------+-----------------+------------------
1 | user@domain.com | 0
还有一些伪代码:
foreach (var user in _context.Users.Where(u => !u.WelcomeLetterSent))
{
SendEmailForUser(user);
user.WelcomeLetterSent = true;
}
_context.SaveChanges();
有一个竞争条件,您的应用程序的实例一和实例二可能_context.Users.Where(...)
在它们中的任何一个有机会设置WelcomeLetterSent = true
和调用之前同时评估SaveChanges
。在这种情况下,可能会向每个用户发送两封欢迎电子邮件,而不是一封。
并发可能是一件阴险的事情。这里有一个关于使用 Entity Framework 管理并发的入门知识,但这只是冰山一角。
你的问题的答案?这取决于您的应用程序做什么:)
最重要的是,理想情况下,我希望构建一些挂钩到同一个数据库的“额外”支持应用程序......而且,我只是不确定 EF 将如何处理同一个数据库的多个应用程序......
如果您的应用程序可以容忍自己访问一个数据库的多个实例,那么让这些“支持应用程序”运行良好通常不是一件容易的事。并发是来自一个应用程序的多个实例还是来自多个应用程序,每个应用程序都有一个实例,这并没有太大区别。