4

我有一个使用 MVC/EF Code First 编程的应用程序。它做了很多服务器端处理,并且非常耗费资源。

我知道如何设置负载平衡,但是,我想知道扩展 EF 应用程序是否像配置新服务器、部署应用程序和指向数据库集群一样简单 - 或者我将面临任何问题多个 EF 应用程序访问同一个数据库服务器?

我似乎找不到任何建议/指南,我担心我选择了 EF 而不是更简单/更直接的东西,我做出了错误的选择!

4

1 回答 1

3

...问题...关于多个 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 将如何处理同一个数据库的多个应用程序......

如果您的应用程序可以容忍自己访问一个数据库的多个实例,那么让这些“支持应用程序”运行良好通常不是一件容易的事。并发是来自一个应用程序的多个实例还是来自多个应用程序,每个应用程序都有一个实例,这并没有太大区别。

于 2013-07-01T11:30:41.790 回答