“...关于多个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服务器。
如果您的应用程序是无状态的,则此问题无关紧要。
至于访问数据库的多个应用程序实例的问题,任何数据访问技术都会有问题。
以下是基本情况:假设您的应用程序按计划向用户发送欢迎电子邮件。
给定表格 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将如何处理多个应用程序连接到同一个DB....
如果您的应用程序可以容忍多个实例访问一个数据库,那么使这些“支持应用程序”和谐运行通常不是问题。无论并发性是来自一个应用程序的多个实例还是每个实例的多个应用程序,情况都不会有太大区别。