【问题标题】:Hibernate Caching Technique休眠缓存技术
【发布时间】:2012-04-29 18:20:22
【问题描述】:

我有一个包含 200 个表的应用程序 - 分为 4 组

  1. 非事务性(50 个表)- 部门、指定等表,有时由管理员更新一次(100000 次读取:1 次写入率和 1 次写入/月)

  2. 事务性较少(50 个表)- 诸如设置、产品、税率之类的表读取次数较多,插入频率较低,但每天都会发生写入(1000 次读取:1 次写入比率和 1 次写入/天)

  3. 事务性(50 个表)- 写入和读取几乎相同的订单、收据等表(10 次读取:1 次写入和 1 次写入/小时)

  4. Heavy Transactional(50 个表)- 诸如任务、历史记录等表,这些表写入更多,读取更少,但被服务和报告使用(1 次读取:1 次写入和 1 次写入/分钟)

    李>

我正在使用 hibernate、struts2 和 spring,并正在寻找缓存策略以获得最佳性能和效率。

如果您发现我在写入和读取最多的表中有更多数据,因此将它们缓存在更关键的位置。

我可以缓存第 4 组表吗?如果是怎么办?

我可以缓存第 3 组表吗?如果是怎么办?

我可以缓存第 2 组表吗?如果是怎么办?

我可以缓存第 1 组表吗?如果是怎么办?

我可以在内存数据库中使用某些表吗?

在某些情况下视图会帮助我吗?哪些情况?

好吧,我最终想要的是从内存数据库中快速读取访问,一些东西会随着数据库的变化而更新我的内存数据库。比如说我有产品列表,内存中有订单列表,但是当添加任何新产品或订单时,这个列表必须重新加载。通常,所有读取都从某个内存数据库中读取,而所有写入直接 db 并触发更新列表或列表项。

【问题讨论】:

  • 如果您的最高活动是每分钟 1 次操作,我严重怀疑缓存是否重要。数据库速度非常快,每分钟 1 次读取/写入不太可能使您的数据库不堪重负。仅当您遇到性能问题并且已经测量并证明缓存是解决方案时才进行优化。否则,您将毫无意义地增加复杂性。
  • 不,它只是每个用户每张桌子的一个球标数字,将有 100 个用户和多个桌子.......基本上需要更多 n 更快:) 即使它不是一个非常大规模的系统,但为了满足一个请求,我们必须将响应时间减少到尽可能短。
  • 您正在使用 Hibernate 特定的 API 或 JPA 与 Hibernate 作为实现?
  • Hibernate 特定的 api。没有 jpa。

标签: java hibernate caching struts in-memory-database


【解决方案1】:

让我们从缓存的经验法则开始,

缓存频繁读取且很少更改的非事务性数据

Hibernate 可以让您非常安全地到达那里。从这一点开始,即使您仍然可以使用缓存,但实际上并不推荐它,因为您可能会遇到多个问题。因此,最好谨慎行事。看看下面的文章列表,它会给你更多的洞察力。

  1. Hibernate: Truly Understanding the Second-Level and Query Caches
  2. Understanding Caching in Hibernate – The Second Level Cache
  3. Improving Hibernate's Performance

因此,当我们将此规则应用于您的场景时,只有第一组应该被缓存。首先这样做,衡量您的应用程序的性能改进。如果一切正常,您也可以考虑缓存第二组。不建议缓存事务表,因此排除了集合 3 和 4。

【讨论】:

    【解决方案2】:

    虽然 ManuPk 已经以非常详细的方式回答了这个问题,但我只想补充几点,Hibernate 提供了一个本地 InProc 缓存,它不能在多服务器环境中使用。所以在负载高峰期,如果响应时间不好,你觉得性能是个问题,你最好选择 2 级缓存。因为它允许使用 NHibernate 的应用程序现在可以扩展到多服务器环境并消除任何数据库瓶颈。请阅读以下文章以获得进一步参考,虽然它是关于 NHibernate(.NET),但它会解释 L1 和 L2 缓存的概念。

    Secondary Level cache, Taking performance ot the next level

    您可以将NCache 用作二级缓存,因为它现在与 Java 和 .NET 应用程序完全兼容。 干杯

    【讨论】: