【问题标题】:Entity Framework with a game server带有游戏服务器的实体框架
【发布时间】:2009-07-28 02:20:38
【问题描述】:

我一直在研究在我的 C# 游戏服务器中使用实体框架来简化查询。我是类型安全的忠实拥护者,Entity Framework 在自动化大多数样板代码方面做得很好。虽然我不太确定如何使用一些组件,即ObjectContext

服务器使用了很多线程,所以线程安全是一个问题。现在我只是使用自定义池来执行查询。无需赘述,每个查询的工作方式如下:

  1. 获取DbConnection
  2. 获取DbCommand
  3. 允许查询类设置参数
  4. 执行DbCommand
  5. 允许查询类处理查询结果(如果有)
  6. 释放DbCommand
  7. 释放DbConnection

它非常干净、快速和安全,但问题是创建查询有点麻烦,如果我想要类型安全,我必须手动生成和更新“容器类”。这就是我转向实体框架的原因。

这一切都适用于仅使用DbConnectionDbCommand,因为不用担心哪个DbConnection/Command 执行查询哪个对象或任何东西。

无论如何,我真的不知道如何在不施加限制的情况下进行更多解释。每次我通常使用DbConnection/Command 执行查询、保存它并处理 ObjectContext 时都会执行一些操作,这只会增加太多开销,而我真的不需要如此频繁地更新数据库。

如果游戏服务器对数据库的即时和持续更新要求不高,您将如何使用 Entity Framework?

【问题讨论】:

  • 您的问题具体是什么?如果您的数据库不经常更新,那么 DataContext 不会造成巨大的开销。你确实处理了你的 dbcommands 和 dbconnections?
  • 很抱歉给您带来了困惑。数据库更新频繁,但数据读取频率很低。至于 DbCommand/Connection,不,我从未处理过它们,但这只是因为很容易重新设计它以使用池而不是处理。我不介意我是否经常创建/处置 ObjectContexts(假设成本很便宜,我认为是这样),但这似乎会破坏很多缓存机会。

标签: c# .net multithreading entity-framework


【解决方案1】:

首先,您需要阅读并内化它:

Performance Considerations for Entity Framework Applications

特别注意:

  1. 为仅重复查询正确设置合并选项
  2. 请注意,视图的预生成仅对 RelatedEnd.Load 之类的内容有帮助,对临时查询没有帮助。使用 CompiledQuery 优化即席查询。对于复杂的查询,查询准备可能是一笔巨大的开销,因此请尽可能进行。
  3. 如果您预先生成了视图并且正确设置了合并选项,那么实例化和处置对象上下文不会产生太多开销。以对您的应用有意义的方式使用它;不要“过早地优化”它的生命周期。

【讨论】:

    【解决方案2】:

    您最有可能注意到 Entity 框架的性能差异的地方在于数据的更新(而不是插入)。这是因为数据必须首先从数据库中读取,然后更改,然后保存回数据库。

    对于对象上下文,我们使用 using 语句,以便立即处理它。当垃圾收集器对所有超出范围的对象运行 dispose 时,游戏暂停是不好的。

    如果您主要阅读,我建议您缓存数据,例如使用 Enterprise Library Caching 应用程序块。

    实体框架将为您提供更高效的编程模型,而缓存将为您提供更好的性能。

    【讨论】:

      【解决方案3】:

      您可能想看看 Subsonic——它更适合您,并且不会像 EF 那样聪明,而且由于简单,通常应该性能更高一些。同时,它很好地涵盖了对象生成角度,因此您不会编写太多样板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        相关资源
        最近更新 更多