【问题标题】:Database Dependent Caching w/ Multiple Databases/SqlServers与/多个数据库/Sql 服务器的数据库相关缓存
【发布时间】:2011-04-22 02:00:59
【问题描述】:

我正在一个环境中工作,其中单个 Web 应用程序(在 Web 场中运行)根据用户选择动态连接到不同的 SQL Server 数据库(可能在不同的服务器上)(这部分是不可协商的,除非您可以给我 1,000,000 美元和/或某种时间改变装置)。

我想缓存应用程序中数据库中的一些常用数据,例如“设置”,并且正在寻找与 SqlCacheDependency 类或相关数据库缓存依赖项一起使用的最佳实践解决方案(不反对 SQL 通知或轮询的自定义实现;通知优于轮询)。

到目前为止,我正在考虑使用可以由连接字符串名称或相关键引用的 SqlCacheDependency 对象集合(每个数据库一个)。因此,当连接更改为不同的数据库时,可以通过 + 的键请求/填充缓存,并使用适当的 SqlCacheDependency 对象(可能由缓存管理包装器处理)。

在这方面有什么想法、建议或经验吗?

还是直接访问数据库更好?

【问题讨论】:

    标签: .net asp.net sql-server database caching


    【解决方案1】:

    您可以在数据访问代码中使用带有二级缓存的 nhibernate 或休眠。对于缓存部分,您可以使用 memcached 或 velocity (appfabric)。

    【讨论】:

    • 你能提供更多的上下文吗?
    • 如果您使用.net,您可以使用nhibernate,对于java,您可以使用hibernate。这些 orm 工具允许二级缓存,可以为您自动缓存最近获取的记录。他们的可插拔架构允许使用你最喜欢的缓存工具,比如 memcached。
    • 不太确定这对解决多数据库问题有何帮助。据我所知,我仍然需要想出一个解决方案来手动管理每个数据库的内容。
    【解决方案2】:

    在我看来,您不应该将来自不同数据库的所有设置都存储在您的 Web 应用程序中。 更好的方法是只存储当前正在使用的数据库的设置。

    您说过,在某些时候,用户选择了数据库,然后您创建连接、打开它、读取数据等等。 这是仅读取此数据库的设置并在应用程序中使用它们的好地方。 同时,您可以调整 SqlCacheDependency 以在当前数据库中的设置发生更改时收到通知。

    当用户选择另一个数据库时,您只需删除当前设置并从新选择的数据库中加载另一个设置。

    在我看来,这更容易实现。

    【讨论】:

    • 如果有 N 个用户同时使用该站点,每个用户都连接到一个可能不同的数据库,每当访问不同的数据库时,它将覆盖所有其他用户的缓存设置。是吗?
    • 您没有告诉所有用户都使用不同的数据库。就您而言,您的解决方案是正确的,但很复杂。您可能需要一个单调类,其他类将使用该类来获取当前站点设置。该类应包含当前设置的集合。首次启动此单音类时应加载设置。此外,该类应该启动单独的线程来更新设置,然后进入睡眠一段时间。在我看来,这个解决方案非常灵活,然后使用 SqlCacheDependency 对象
    • 所以您建议使用投票解决方案? SqlCacheDepenency 类的好处是,每当数据库中的数据发生变化时,SqlServer 都会通知应用程序,因此它只需要在数据实际发生变化时获取数据,并且它会立即知道缓存何时不同步并需要刷新。另外,您如何让一个单独的线程在 Web 应用程序池中永久处于活动状态?
    • 其实这完全取决于你。我的方式和 SqlCachDependency 做的方式是一样的。他们都应该不时轮询数据库以检查设置是否已更改。唯一的区别是 SqlCacheDependency 创建了额外的数据表和几个过程。这意味着,您应该始终在所有数据库中都有该表。至于我,我更喜欢自己写这样的东西,以确保它以我想要的方式工作。但是,这似乎只是一个坏习惯。我刚刚阅读了有关此组件的更多信息,并且可能会告诉您它看起来很适合您。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 2020-07-25
    • 2018-05-31
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多