用于有状态应用程序的 ORM。 EF适合吗?或者任何?

ORM for stateful application. Does EF fit? Or any?

我需要一个适合有状态应用程序的 ORM。我将在具有持久客户端连接的低延迟实时游戏服务器中保持请求之间的实体。只有 1 个服务器实例连接到数据库,因此无法从 "outside" 更改任何数据,服务器可以依赖其缓存。

当用户远程登录到服务器时,其整个配置文件将加载到服务器内存中。还为每个用户创建了几个更高级别的服务来操作配置文件数据并提供功能。它们还可以有内部字段(状态)来存储临时数据。当用户想要更改他的签名时,他要求相应的服务这样做。该服务跟踪用户更改其签名的频率,并且每十分钟仅允许一次(例如)-db 中不会跟踪如此短的间隔,这是一个临时状态。此更改应存储到仅执行 1 个查询的数据库中:UPDATE users SET signature = ... WHERE user_id = ...。当用户注销时,它会在 minutes/hours 不活动后从服务器内存中卸载。这里的db只是一个存储。这就是我所说的有状态。

  1. 一些实体被认为是 "static data" 并且只在应用程序启动时加载一次。这些可以从其他 "dynamic" 实体中引用。加载 "dynamic" 实体不应要求重新加载引用的 "static data" 实体。
  2. Update/Insert/Delete 应该 set/insert/delete 只更改 properties/entities 即使 "detached" 实体。
  3. 写入操作不应每次都从数据库加载数据(执行Select)以初步检测更改。 (可以在动态生成的继承者中跟踪状态。)我在本地有一个状态,加载任何东西都没有意义。 我想在连接范围之外继续跟踪更改,并且 "upload" 需要时更改。
  4. 执行操作时,不应更改持久化对象的引用。
  5. 每个用户的 DBConnection 将不起作用。预计在线人数上千。
  6. 来自 "static data" 的实体可以分配给 "dynamic" 实体属性(代表外键)并且 Update 应该正确处理它。

现在我正在使用 NHibernate,尽管它是为无状态应用程序设计的。它支持重新附加到会话,但这看起来很不常见,需要我使用未记录的行为并且不能解决所有问题。

我不确定 Entity Framework - 我可以这样使用吗?或者你能推荐另一个 ORM 吗?

如果服务器在每次用户点击按钮时重新创建(或特别是重新加载)用户对象,它会非常快地吃掉 CPU。 CPU 垂直缩放代价高昂但效果很小。相反,如果你没有 RAM,你可以去购买更多——就像水平缩放一样,但更容易编码。如果您认为这里应该使用另一种方法,我准备讨论它。

是的,您可以将 EF 用于此类应用程序。请记住,在重负载下,您会不时遇到一些数据库错误。通常,当您的应用程序跟踪更改而不是 EF 时,错误后恢复速度更快。顺便说一句,你也可以这样使用NHibernate。

我在一个会话极长的有状态桌面应用程序中使用了 hibernate:会话在应用程序启动时开始,并在应用程序 运行 期间一直保持打开状态。我对此没有问题。我绝对不使用附加、分离、重新附加等。我知道这不是标准做法,但这并不意味着它不可行,或者有任何陷阱。 (编辑: 但当然要阅读下面的讨论,了解其他人可能会犯的错误。)

我什至在此基础上实现了自己的更改通知机制(独立线程直接轮询数据库,绕过休眠),因此甚至可以让外部代理在休眠时修改数据库 运行,并让您的应用程序注意到这些更改。

如果你有很多东西已经在使用 hibernate,那么放弃你已经拥有的并重写它可能不是一个好主意,除非你确定 hibernate 绝对不会做你想做的事完成。