繁体   English   中英

带有游戏服务器的实体框架

[英]Entity Framework with a game server

我一直在研究在C#游戏服务器中使用Entity Framework,以使查询更加容易。 我是类型安全的忠实拥护者,并且Entity Framework在自动化大多数样板代码方面做得很好。 尽管我不太确定如何去利用某些组件,即ObjectContext

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

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

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

只需使用DbConnectionDbCommand这一切都可以很好地工作,因为不必担心哪个DbConnection / Command对哪个对象或任何对象执行查询。

无论如何,我真的不知道如何在不施加限制的情况下对其进行更多解释。 当我通常不需要频繁地更新数据库时,通常每次使用DbConnection / Command执行一次查询,保存它以及部署ObjectContext之类的操作只会增加过多的开销。

您如何将实体框架用于对数据库没有很高要求的即时且不断更新的游戏服务器?

首先,您需要阅读以下内容并将其内部化:

实体框架应用程序的性能注意事项

特别注意:

  1. 正确设置合并选项以进行仅查询
  2. 请注意,视图的预生成仅对诸如RelatedEnd.Load之类的东西有用,而对即席查询没有帮助。 使用CompiledQuery优化临时查询。 对于复杂的查询,查询准备可能会是一笔巨大的开销,因此请尽可能做到这一点。
  3. 如果您已经预先生成了视图并且正确设置了合并选项,则实例化和处理对象上下文将不会有很多开销。 以对您的应用程序有意义的方式使用它; 不要“过早优化”其生命周期。

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

对于对象上下文,我们使用using语句,以便立即将其处置。 在垃圾收集器运行所有超出范围的对象时,让游戏暂停会不好。

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

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

您可能想看看Subsonic,它比您的小巷还多,并且没有尝试像EF一样聪明,并且由于简单性,通常应该表现得更好。 同时,它很好地覆盖了对象生成角度,因此您无需编写太多样板文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM