用Hibernate + Spring进行caching – 一些问题!

我正在开发与Spring 3和Hibernate 3.6的Web应用程序。 目前我尝试了解如何使用Spring和Hibernate进行caching。 我发现一些关于Hibernate的caching和Spring的一些资料,现在我试着把我的信息整合在一起。 我仍然对这两个框架都有一些问题,如果有人能回答他们,或者告诉我这里列出的事实是否正确,我会很高兴。

大多数情况下,简短的答案(是/否)就足够了。 我认为这个列表对其他人也是有用的,他们想了解如何使用spring和hibernate进行caching。

General

1) Hibernate支持以下caching:1级caching,2级caching,查询caching

2) Spring本身支持以下caching可能性:只是方法caching

1st Level Cache

3)第一级caching是每个Hibernate应用程序的一部分。

4)第一级caching是为每个hibernate会话创build的。

5)什么是保存在一级caching? 对象还是其属性的值? 查询和他们的结果?

2nd Level Cache

6)我发现:二级caching每个应用程序使用一次。 这不是假的吗? 是不是每个sessionfactory使用一次? 和:多个sessionfactorys =多个二级caching可能?

7)在二级caching中保存的内容:在我看来,只是属于一个logging的值,而不是对象本身。

8)当从二级caching中的一条logging存储值时,它可能存储相关的值(从通过外键连接的对象)呢?

9)在更新二级caching中的一个对象的值时,是否有可能更新caching中与它连接的对象的值呢?

10)当一个对象的值正在改变时,如何更新二级caching? 冲洗? 我可以只更新caching的一部分,或者必须更新整个caching吗?

11)第二级caching在哪里是有意义的,在哪里呢?

12)caching模式:每种caching模式是否提供了不同的caching策略? 例如使用caching模式“只读”,数据库和caching的同步是不必要的? 做其他caching模式提供同步? 我认为同步必须由开发人员自己完成?

Query Cache

13)查询caching与二级caching有什么区别? 在我看来:在查询caching结果集保存,但不是与他们的价值,只是与他们的ID。 当再次使用查询并且结果集仍然是“正确的”时,属于id的值从二级caching中查询

14)对于查询caching,必须使用二级caching?

15)查询caching在哪里是合理的,哪里没有?

Spring

16) Spring是否比方法caching提供更多的caching可能性?

17)方法caching没有链接到hibernatecaching

18)但是:对于方法caching第二级是必要的,如ehcache(它也可以用于hibernate)

19)可以使用方法caching没有数据库查询?

Getting mixed up

20)如果使用ehcache作为第二级caching和ehcache作为spring的方法caching,我可以使用相同的ehcache-instance吗? 有什么东西混在一起的机会吗?

21)当使用1级caching和2级caching时,它们能混合起来吗? 当查询数据库时,结果从哪里来,第一级或第二级caching? 第一级caching是否与第二级caching一起工作?

22)通过使用我提到的caching可以混淆的其他任何东西? 🙂

谢谢你的回答,不pipe有什么问题! 🙂

Hibernate支持以下高速caching:1级高速caching,2级高速caching,查询高速caching

是。

Spring本身支持以下caching可能性:只是方法caching

Spring 3.1引入了基于方法注释的新的caching抽象,是的。

第一级caching是每个Hibernate应用程序的一部分。

是。

第一级caching是为每个hibernate会话创build的。

是的,尽pipe您可以在任何时候手动清除它。

什么是保存在一级caching? 对象还是其属性的值? 查询和他们的结果?

它是在会话生命期间获取的所有对象的映射,如果第二次通过id载入同一个对象,它将从L1加载。

我发现:二级caching每个应用程序使用一次。 这不是假的吗? 是不是每个sessionfactory使用一次? 和:多个sessionfactorys =多个二级caching可能?

你是对的,通常每个应用程序(数据库)只有一个会话工厂,因此是快捷方式。

什么是保存在二级caching:在我看来,只是属于一个logging的值,而不是对象本身。

与L1相同的东西,但他们活得更长。 L2通常由一些工业强度的caching支持,而L1只是一个映射(甚至不必是线程安全的)。 它存储完整的实体,包括懒惰加载的关系。

当从二级caching中的一个logging中存储值时,它可能存储相关的值(来自通过外键连接的对象)呢?

您不手动pipe理L2,它会自动发生。

当更新二级caching中的一个对象的值时,是否有可能更新caching中连接的对象的值呢?

往上看。

当一个对象的值正在改变时,如何更新二级caching? 冲洗? 我可以只更新caching的一部分,或者必须更新整个caching吗?

看到上面 – hibernate会为你解决这个问题。 你从不直接与L2交互。

第二级caching在哪里是有意义的,在哪里呢?

测量。 在由主键读写大量数据并且读写因子很高的应用中,L2对你的性能有很大的影响。

caching模式:每种caching模式都提供了不同的caching策略? 例如使用caching模式“只读”,数据库和caching的同步是不必要的? 做其他caching模式提供同步? 我认为同步必须由开发人员自己完成?

caching模式有助于Hibernateselect最佳的caching和无效策略。 例如,如果caching是只读的,Hibernate不会打扰使其无效(或不会经常这样做)。 但只读caching(只读实体)当然会禁止任何更新。

查询caching和二级caching之间有什么区别? 在我看来:在查询caching结果集保存,但不是与他们的价值,只是与他们的ID。 当查询被再次使用并且结果集仍然是“正确的”时,从二级caching查询属于这些id的值。

确实,但这是一个非常广泛的话题。 尤其是结果集仍然是“正确的”部分。

对于查询caching,必须使用二级caching?

是的,没有L2查询caching没有意义,并会显着减慢应用程序。

查询caching在哪里是有意义的,在哪里呢?

很难的问题,通常当你执行相同的查询很多次,而查询参数的范围很低(对于每个查询参数集合,新的查询caching是以所有logging为结果创build的)。

Spring是否比方法caching提供更多的caching可能性?

不,spring或多或less只是你自己的代码的粘合剂。

方法caching没有链接到hibernatecaching。

spring没有链接到hibernate,所以…

但是:对于caching方法来说,第二级是必要的,比如ehcache(它也可以用于hibernate)

L2是Hibernate的概念。 如果你想caching方法,你需要一些底层caching。 让它成为EhCache,没关系。 当然它必须是线程安全的。

可以使用方法caching没有数据库查询?

Spring与Hibernate无关。 您可能会caching与数据库无关的计算。

如果使用ehcache作为第二级caching的ehcache和spring的ehcache来进行方法caching,我可以使用相同的ehcache-instance吗? 有什么东西混在一起的机会吗?

您可以使用与Hibernate相同的CacheManager和cachingconfiguration来简化部署。 只要caching名称不重叠,它们是完全独立的,即使在同一个pipe理器中工作也是如此。

当使用1级caching和2级caching时,它们能混合起来吗? 当查询数据库时,结果从哪里来,第一级或第二级caching? 第一级caching是否与第二级caching一起工作?

他们只是工作,只要一些抽象不泄漏:-)。 当你通过主键查询时,首先检查L1(更快),然后L2。

还有其他什么可以通过使用我提到的caching混淆? 🙂

看上面,抽象倾向于泄漏。 但是,当你改变数据库时,最糟糕的问题就来了,而Hibernate对此并不了解。 如果没有适当的复制也会造成你头痛。 而最大的问题 – 通常不正确的caching实际上减慢了应用程序的速度(查询caching在这里是最危险的)。

关于Spring和二级caching,有一个很酷的开源项目,可以使用2Lcaching:

例如: http : //code.google.com/p/ehcache-spring-annotations/

我们在生产环境中使用它,使我们的生活变得更加轻松。