使用“缓存”LINQ实体

时间:2009-11-10 09:15:09

标签: c# sql linq wcf linq-to-entities

我遇到的问题是我实现了一个使用LINQ实体的WCF服务...要生成服务调用响应的内容,需要大量的LINQ / SQL选择...

无论如何,该服务没有对​​数据库进行任何更新或插入,所以我想实现一种LINQ实体的“缓存”(数据库内容也没有增长到数百万......它确实会被限制在大约63,000个mainentries(具有次级依赖性),例如User - > Orders)

此外,服务响应不必包含100%up2date数据,因此后台数据的更新不应该在这里考虑

好的,目前我的计划如下:

  • 使用LINQ从数据库中获取所有相关表,以便所有对象都“缓存”(ToList()函数应该这样做,对吗?)
  • 每隔x分钟/小时通过一种智能线程替换实体对象(比如再次从db中获取数据,锁定当前缓存的linq-DataContent并将其替换为新的..)

那么,你有什么看法......你认为我应该/可以这样做吗?我真的需要增加服务的响应时间,但优化SQL(例如选择较少的数量)对我来说不是一个真正的选择,因为所有的LINQ内容都已经实现了。

提前致谢!

2 个答案:

答案 0 :(得分:2)

这听起来像对我来说过早优化。考虑:

  1. 许多的东西可能会减慢像这样的应用程序。数据库查询可能根本不是缓慢的部分。如果慢速部分是L2E编译,则缓存结果是错误的解决方案。
  2. 正确执行缓存失效通常比优化查询更难。当然有例外。
  3. EF 已经在上下文中缓存实体实例。确保你没有重新发明轮子。
  4. 换句话说,首先编写正确的代码,抽象得足够多,如果必须,可以插入缓存(存储库模式对此有利)。对它进行分析,找到缓慢的部分,然后先修复它们。

答案 1 :(得分:1)

我认为你建议的方法是恰当的。无论如何,除非你确定总是访问相关类中的所有数据库寄存器,否则我会修改它,以便它不是在启动时检索整个表,而是在第一次需要时检索寄存器。像这样:

GetRegister(id)
    if cache has not register with that id
        retrieve register from database
        store register in cache
    return cached register

通过这种方式,您可以实现缓存,但不会浪费不必要的内存。