NHibernate 二级缓存

NHibernate 是一个流行的对象关系映射 (ORM) 框架,用于 .NET 应用程序,通过面向对象的代码实现无缝数据库交互。然而,当应用程序处理大量事务负载时,它们经常会因为频繁的数据库查询而遇到性能瓶颈。

为了解决这个问题,NHibernate 提供了二级缓存,它将对象保存在应用程序级别的内存中,从而减少了重复访问数据库的需要。 NCache是一种速度极快且可扩展的分布式缓存,可充当 NHibernate 二级缓存 提供程序,显著提高应用程序的速度、可扩展性和可靠性。

NCache 它为 NHibernate 提供高性能、分布式二级 (L2) 缓存,消除 .NET 应用程序中的数据库瓶颈。它提供线性可扩展性,通过对等集群实现 100% 正常运行时间,并且集成无需任何代码更改。

如何 NCache 如何提升 NHibernate 应用的性能?

NCache 通过更快的查询、更少的数据库负载以及更高的可用性来提升 NHibernate,如下所述。

  • 性能: 将频繁访问的数据存储在内存中,可减少高达 90% 的数据库访问次数,从而加快查询执行速度并提高响应速度。这消除了“数据库瓶颈”,即数据库无法处理来自多个 Web 服务器的大量重复读取请求的情况,从而使应用层能够线性扩展,同时将数据库负载降至最低。内部基准测试表明 NCache 每秒可处理超过 2 万次操作,延迟低于毫秒级。
    • 客户端缓存: 它允许应用程序从自己的内存访问最常用的缓存数据子集,从而减少网络调用并进一步提高性能。
    • 紧凑序列化: NCache 确保高效的序列化和反序列化 紧凑序列化,使得数据检索速度明显快于标准 .NET 序列化。
  • 线性可扩展性: NCache 允许应用程序通过添加更多缓存服务器来动态扩展。它还能确保缓存负载在集群环境中均匀分布。
  • 高可用性: NCache的对等集群消除了停机时间,而自动故障转移和复制可防止数据丢失并保持缓存一致性。 NCache 通过多种缓存拓扑提供智能数据复制,包括:
    • 分区副本缓存: 跨分区维护缓存数据的冗余副本以防止数据丢失。
    • 镜像缓存: 提供同步备份机制,实现实时故障转移。
    • 复制缓存: 通过在集群中的多个节点上分布相同的缓存来确保数据可用性。
  • 常见用例 NCache NHibernate L2 缓存:
    • 高流量网站农场: 在不发生数据库争用的情况下,将 .NET 应用程序扩展到多个服务器。
    • 实时数据一致性: 使用 SQL 依赖项将缓存与外部数据库更改同步。
    • 遗留系统现代化: 使用即插即用提供程序提高现有 NHibernate 应用程序的性能。

技术比较:NHibernate L1 与 NCache L2

特性 NHibernate L1(会话缓存) NCache (分布式 L2 缓存)
范围与隔离 事务范围。数据被隔离到单个事务中。 会话 目的。 进程级/集群级。数据在 Web 服务器集群中的所有会话和所有服务器之间共享。
数据持久化 临时对象。会话关闭或请求结束后,对象即被销毁。 持久化内存存储。数据独立于应用程序重启或会话关闭而保存在缓存集群中。
可扩展性 仅限进程内使用。受限于单个 Web 服务器的内存;无法在服务器集群中共享。 线性可扩展性。您可以动态添加缓存服务器来增加存储容量和吞吐量。
数据库同步 没有。L1 没有机制来知道其他进程是否更新了数据库。 自动同步。用途 SqlCache依赖项使用 Oracle 依赖项或轮询来使过期数据失效。
查询缓存 不适用(L1 主要用于基于 ID 的查找)。 已支持。缓存复杂查询的结果,避免重复执行代价高昂的 SQL 语句。

主要特点 NCache 对于 NHibernate

以下是一些主要特点 NCache 为 NHibernate 用户提供:

无需更改代码

  • 轻松集成 休眠 作为即插即用的解决方案,无需修改现有的应用程序代码。
  • 所有配置都通过基于 XML 的配置文件进行管理。

多个可缓存区域

  • 缓存项优先级:为缓存数据分配不同的优先级(高、正常、低),确保经常访问的对象在缓存中停留更长时间。
  • 绝对到期缓存条目会在固定时间过期。这样可以确保无论访问频率如何,过期数据都会被自动清除。
  • 滑动到期:访问时到期时间会重置,这使其成为经常使用但动态的数据的理想选择。
  • 基于区域的配置:使用以下方法自定义不同数据区域的缓存行为 NCacheNHibernate.xml 配置文件。
<configuration>
  <application-config application-id="myapp"
                      enable-cache-exception="true"
                      default-region-name="default"
                       key-case-sensitivity="false" >
    <cache-regions>
      <region name="AbsoluteExpirationRegion"
              cache-name="demoCache"
              priority="Default"
              expiration-type="sliding"
              expiration-period="180" />
          <region name="default" 
              cache-name="demoCache" 
              priority="default"
              expiration-type="none" 
              expiration-period="0"/>
    </cache-regions>
  </application-config>
</configuration>

如何 NCache 如何保持 NHibernate 数据与数据库同步?

  • 监视数据库变化以使缓存数据保持最新。
  • 与基于 SQL Server、Oracle 和 OLEDB 的数据库无缝协作。
  • 使用 基于 SQL 依赖关系的失效 删除或者刷新陈旧的缓存数据。
<configuration>
   <application-config application-id="myapp" 
      enable-cache-exception="true" 
      default-region-name="default" 
      key-case-sensitivity="false">

    <database-dependencies>
      <dependency entity-name="nhibernator.BLL.Customer" 
                     type="sql"
sql-statement="SELECT ContactName FROM dbo.Customers WHERE CustomerID =?"                     
                cache-key-format="dependency.customer: [us]"/>
    </database-dependencies>
  </application-config>
</configuration>

NHibernate 查询缓存

  • 查询结果缓存:缓存查询结果以减少重复执行相同的数据库查询。
  • 查询存储:将查询存储在 NHibernate.QueryCache 区域以便更快地进行查找。
  • 异步操作:以非阻塞方式更新缓存,确保应用程序执行不会延迟。
  • 同步操作:当数据库发生变化时立即更新或使缓存数据无效,保持数据的一致性。

在应用程序代码中启用查询缓存

此示例展示如何使用 NCache 存储和重用查询结果以提高性能。

using (var session = sessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
        IQuery query = session.CreateQuery("FROM Customer c")
                              .SetCacheable(true);
        var customers = await query.ListAsync<Customer>();

        var newCustomer = new Customer { Name = "John Doe" };
        await session.SaveAsync(newCustomer);

        await session.FlushAsync();
        transaction.Commit();
    }
}

如何配置 NCache 与NHibernate?

安装 NCache NHibernate 客户端

  • 安装 NCache 通过 NuGet 为企业提供 NHibernate 提供程序:
    Install-Package NHibernate.NCache

安装 NCache 服务器

配置 NCache 对于 NHibernate

修改 NHibernate 配置文件以启用 NCache 作为二级缓存提供者。

更新 hibernate.cfg.xml

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="cache.provider_class">
      Alachisoft.NCache.Integrations.NHibernate.Cache.NCacheProvider,
      Alachisoft.NCache.Integrations.NHibernate.Cache
    </property>
    <property name="cache.use_second_level_cache">true</property>
  </session-factory>
</hibernate-configuration>

接下来做什么?

常见问题

NCache 它提供了一种分布式、多节点的替代方案,以取代 NHibernate 的默认主缓存 (L1)。虽然 L1 仅限于单个会话, NCache 允许您的应用程序在整个 Web 服务器集群中共享缓存数据,从而减少高达 90% 的数据库访问次数,并防止在高峰流量期间出现数据库瓶颈。

是的。 NCache 完全支持 NHibernate 查询缓存,可将开销较大的 SQL 查询结果存储在分布式缓存中。这确保了使用相同参数的后续查询无需访问数据库,从而显著降低应用程序延迟。

NCache 通过数据库同步功能保持 100% 的数据一致性。通过使用 SQL 依赖项 (SqlCacheDependency) 或 Oracle 依赖项, NCache 当底层数据库数据发生更改时,会自动使过期的缓存项失效并删除它们,从而确保您的应用程序始终提供最新信息。

无需修改代码。 NCache 是一个即插即用的 L2 缓存提供程序。集成完全通过修改您的配置来完成。 休眠文件.cfg.xml or 应用程序配置文件 文件指向 NCache 供应商工厂。

对于大多数 NHibernate 环境,建议采用分区副本拓扑结构,因为它在性能和高可用性之间实现了最佳平衡。对于读取密集型工作负载,可以启用客户端缓存(进程内)功能,通过将部分数据直接存储在应用程序内存中,提供接近缓存的速度。

联系我们

联系电话

+1 214-619-2601 (美国)

+44 20 7993 8327 (英国)

©版权所有 Alachisoft 2002 - 版权所有。 NCache 是 Diyatech Corp. 的注册商标。