【问题标题】:How do i cache my business objects to avoid round trips to the database?如何缓存我的业务对象以避免往返数据库?
【发布时间】:2011-04-07 03:19:34
【问题描述】:

我让自己背负着一个现有的应用程序 - 它尝试自己做很多事情,但大部分事情都做得很糟糕!

此应用程序是一个 ASP.net 3.5 Web 应用程序,具有典型的 UI -> 业务 -> DAL 类型的模式。

我面临的问题是,当多个用户请求相同的信息时,即使只是为了查看它,也会实例化相同的业务对象,并从数据库中检索相同的数据。

目前,这些对象还没有像工厂实现或类似的东西的单点实例化。对象实例化只是散落在各处。

我一直在考虑的一个选择是将整个实例化逻辑封装在工厂中 - 并在工厂中构建逻辑以缓存对象并相应地返回。

我正在考虑的另一个选项 - 我过去在我的一个项目中使用过 CSLA,我想我记得它曾经用于缓存业务对象。然而,我不知道它是如何实现这一目标的。我正在考虑使用像 CSLA 这样的框架,它提供了这样一种工具来缓存我的业务对象。

但是,上述两种选择都具有相当的侵入性,如果不彻底改造,将涉及影响整个业务层的重大改造,这对我来说是一个主要问题,因为没有(阅读 zilch,nada,零,大 - O) 对代码的任何部分进行自动化单元测试。

我想知道的是:

  1. 有没有人知道任何框架/产品可以提供一种侵入性较小的方式让我能够在不重新设计/重写整个业务层的情况下实现这一目标?

  2. 如果没有 1,与上述两个选项相比,是否有更容易实施的建议?

不,退出公司不是一种选择 - 无论如何都不是! :-)

【问题讨论】:

    标签: design-patterns frameworks caching business-objects


    【解决方案1】:

    通过分析和memoize他们的电话找到最严重的违规者。

    回复评论

    Memoization 与使用模式无关,它实际上只是用更便宜的核心查找替换昂贵的操作(命中数据库)。使用模式肯定会影响系统内记忆的有效性,但不会影响记忆代码的编写方式。

    这是一个便宜的例子:

    define square_root(n):
       if cache[n] does not exist then
          cache[n] = compute_root(n)
    
       return cache[n]
    

    这意味着您第一次调用square_root(1729) 时需要一些时间来计算根。 square_root(1729) 的所有后续调用将只需要缓存查找。如果该调用不再进行,您将浪费缓存时间和空间。

    因此,square_root 的记忆只要求n 有一个唯一的结果。是否有用优化是实际使用的一个因素。

    【讨论】:

    • @msw - 最严重的违规者不会取决于最终用户的使用模式 - 这需要我首先弄清楚该应用程序的使用方式还是我没有正确理解这一点?我之前没有提到它,但该应用程序还没有上线..它在过去 2 年里一直在开发:(-
    • 如果它不是实时的,那么我希望你有一些测试数据,我希望它能够在某种程度上代表实时数据。如果没有,那么我们就剩下一个古老的禅宗问题:“如果一个程序从未部署过,它是否存在性能问题?” careers.stackoverflow.com/?campaign=PrettyHeader
    • @msw - 我确实有合理的测试数据,这些数据具有代表性,但没有太多关于用户通常如何使用屏幕的信息 - 即,如果他们今天创建了一个新实体,它是否会经常被查询/查找其他部门的很多其他人/它是否经常更改等等。我以前没有做过记忆,但根据你提供的链接和我对它的理解,记忆需要那种信息。这种理解正确吗?
    • @msw - 另外,您关于这是否是性能问题的观点是有效的。由于我被带去清理,在某种程度上,我正在寻找一些主动优化!但是,这绝对是我需要重新考虑的事情,是否值得在这一点上花费时间/精力
    • @msw - 感谢您的投入!我想我会尝试这种方法。
    【解决方案2】:

    缓存已融入 ASP.Net,而在 .Net 4.0(我知道您还没有切换)中,相同的缓存可以在 ASP.Net 类内部或外部的任何地方使用。

    您仍然需要控制您的对象实例化。我建议一个依赖注入框架。我喜欢 autofac,这将允许您从某个依赖注入的提供程序请求新对象,并决定您将如何处理此提供程序中的缓存。

    你来找我们有一个问题,我给了你 3 个(学习如何使用和实现依赖注入框架,学习如何使用 asp.net 缓存,使用缓存策略来解决你的性能问题),但这可能是您最灵活和可维护的选择。

    【讨论】:

    • 是的,你给了我很多东西要看!!感谢您的投入!我知道这里可能没有快速简便的出路——尽管我仍然希望有一个:-)
    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2012-07-20
    • 2011-05-24
    • 2016-03-24
    • 2010-10-22
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多