【问题标题】:WinForms App Data Caching - In Which Layer to Cache?WinForms 应用程序数据缓存 - 在哪一层缓存?
【发布时间】:2009-02-27 15:46:46
【问题描述】:

我们在与我的应用程序数据库位于同一实例的数据库中拥有每晚更新的数据。因此,为了节省数据库调用,我想将此静态数据缓存到 List(Of MyObject) 中。从理论的角度来看,这个缓存的 List(Of ) 是否应该通过全局变量缓存在表示层代码中?它应该在 .DLL 的全局变量中吗?

我正在考虑 .DLL,因为我创建了一个服务层,它公开暴露给 GUI,并调用 .DLL 内的数据访问层:

Public Shared Function Search(ByVal criteria As Core.Other.Customer) As List(Of Core.Other.Customer)
    ' TODO: Check the customer cache to see if it has been populated yet. If not, populate it.
    If 1 = 1 Then
        ' TODO: Variable "list" needs to be a global object in the DLL.
        ' For SO readers: Dal class declared Friend.
        Dim list As List(Of Core.Other.Customer) = Dal.Search.Customers.GetCache()
    End If

    Dim results As New List(Of Core.Other.Customer)
    ' TODO: Find the relevant customers in the cache and add them to variable "results".
    Return results
End Function

我是否会以最好的方式解决这个问题?

【问题讨论】:

    标签: vb.net winforms caching theory


    【解决方案1】:

    我倾向于将其缓存在您的服务层中。我喜欢让我的数据访问保持简单(通常使用像 NHibernate 这样的 OR/M),所以我不想在那里做任何可能改变我对数据访问层工作方式的期望的愚蠢行为(作为开发人员,我希望所有调用 DAL 以实际命中 DB,而不是缓存,除非它是 OR'M 的缓存,这是我不关心的实现细节)。

    该服务似乎是合适的位置(当我缓存数据时,我会在我的应用程序中执行此操作,如果这有帮助的话)。

    【讨论】:

      【解决方案2】:

      您的 List(Of x) 是否需要任何处理,还是只是从数据库中提取的原始数据?

      如果只是从数据库中提取的原始数据,最好将其缓存在数据访问层。

      但如果需要处理,则应该在业务逻辑层进行

      既然您指的是演示代码和 .DLL,那么您的意思是指 n-tier architecture 吗?

      【讨论】:

      • 数据只是未经处理的原始数据 - 客户列表、地址、ID 等。是的,它是 n 层的。
      【解决方案3】:

      您可以考虑在不进行缓存的情况下执行此操作,并查看是否存在性能/网络问题。这可能是过早的优化?

      【讨论】:

      • 有些用户会通过 VPN 使用该应用程序,可悲的是,这在公司中是低于标准的。此处需要 2 秒的数据库调用在 VPN 上需要 10 秒。我需要考虑一些优化。
      猜你喜欢
      • 2020-06-27
      • 2011-11-29
      • 1970-01-01
      • 2013-02-26
      • 2012-07-04
      • 2022-11-11
      • 2018-06-07
      • 2012-03-26
      • 2014-07-05
      相关资源
      最近更新 更多