用Hibernate + Spring缓存 - 一些问题!

nan*_*no7 63 spring caching hibernate ehcache second-level-cache

我正致力于使用Spring 3和Hibernate 3.6开发Web应用程序.目前我试图了解如何使用Spring和Hibernate进行缓存.我找到了一些关于使用Hibernate缓存的消息来源以及一些关于Spring的消息,我现在尝试将我的信息结合在一起.我仍然对这两个框架都有一些问题,如果有人能够回答它们或告诉我这里列出的事实是否正确,我会很高兴.

大多数时候,简短的答案(是/否)就足够了.我认为这个列表对其他人也很有用,他们想要了解spring和hibernate的缓存是如何工作的.

General

1) Hibernate支持以下缓存:第一级缓存,第二级缓存,查询缓存

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

1st Level Cache

3)第一级缓存是每个Hibernate应用程序的一部分.

4)为每个休眠会话创建第一级缓存.

5)第一级缓存中保存了什么?对象或只是其属性的值?查询及其结果?

2nd Level Cache

6)我发现:每个应用程序使用ONCE二级缓存.那不是假的吗?是不是每次sessionfactory使用ONCE?和:多个sessionfactorys =多个第二级缓存可能吗?

7)在二级缓存中保存的内容:在我看来,只是属于一条记录的值,而不是对象本身.

8)当存储来自二级缓存中的一个记录的值时,它是否可以存储相关值(来自通过外键连接的对象)?

9)更新二级缓存中一个对象的值时,是否可以更新缓存中与其连接的对象的值?

10)当一个对象的值发生变化时,如何更新二级缓存?冲洗?我可以只更新缓存的一部分,还是必须更新整个缓存?

11)二级缓存在哪里有意义,哪里不存在?

12)缓存模式:每个缓存模式都提供不同的缓存策略吗?例如,对于缓存模式"只读",不需要同步数据库和缓存吗?其他缓存模式是否提供同步?我认为同步必须由开发者自己完成?

SessionFactory

13)查询缓存和二级缓存有什么区别?在我看来:在查询缓存中,结果集被保存,但没有使用它们的值,只有它们的ID.当再次使用查询并且结果集仍然"正确"时,将从二级缓存中查询属于id的值

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

15)查询缓存哪里有意义,哪里不存在?

Query Cache

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

17)方法缓存没有与hibernate缓存相关联

18)但是:对于方法缓存,第二级是必要的,比如ehcache(也可以被hibernate使用)

19)可以在没有数据库查询的情况下使用方法缓存吗?

Spring

20)如果使用ehcache作为二级缓存的hibernate和用于方法缓存的spring的ehcache,我可以使用相同的ehcache-instance吗?是否有可能混淆了什么?

21)当使用第一级缓存和第二级缓存时,它们会混淆吗?在查询数据库时,结果来自哪里,第一级或第二级缓存?第一级缓存是否与二级缓存一起使用?

22)其他任何可以通过使用我提到的缓存混淆的东西?:-)

谢谢你的回答,不管是什么问题!:-)

Tom*_*icz 74

Hibernate支持以下缓存:第一级缓存,第二级缓存,查询缓存

是.

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

Spring 3.1引入了基于方法注释的新缓存抽象,是的.

第一级缓存是每个Hibernate应用程序的一部分.

是.

为每个hibernate会话创建第一级缓存.

是的,虽然您可以在任何给定时刻手动清除它.

第一级缓存中保存了什么?对象或只是其属性的值?查询及其结果?

它是在会话生命期间获取的所有对象的映射,如果您第二次按id加载相同的对象,它将从L1加载.

我发现:每个应用程序使用ONCE二级缓存.那不是假的吗?是不是每次sessionfactory使用ONCE?和:多个sessionfactorys =多个第二级缓存可能吗?

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

在第二级缓存中保存的内容:在我看来,只是属于一条记录的值,而不是对象本身.

与L1相同,但它们的寿命更长.L2通常由一些工业级高速缓存支持,而L1只是一个映射(它甚至不必是线程安全的).它存储完整的实体,包括延迟加载的关系.

当存储来自二级缓存中的一个记录的值时,它是否可以存储相关值(来自通过外键连接的对象)?

您不手动管理L2,它会自动发生.

更新二级缓存中一个对象的值时,是否可以更新缓存中与其连接的对象的值?

往上看.

当对象的值发生变化时,如何更新二级缓存?冲洗?我可以只更新缓存的一部分,还是必须更新整个缓存?

见上文 - Hibernate将为您解决这个问题.你永远不会直接与L2互动.

第二级缓存在哪里有意义,哪里不存在?

测量.在通过主键读取大量数据并且读写因素非常高的应用程序中,L2会对您的性能产​​生重大影响.

缓存模式:每个缓存模式是否提供不同的缓存策略?例如,对于缓存模式"只读",不需要同步数据库和缓存吗?其他缓存模式是否提供同步?我认为同步必须由开发者自己完成?

缓存模式有助于Hibernate为缓存和无效选择最佳策略.例如,如果缓存是只读的,Hibernate将不会打扰它(或者它不会经常这样做).但只读缓存(只读实体)当然会禁止任何更新.

查询缓存和二级缓存之间有什么区别?在我看来:在查询缓存中,结果集被保存,但没有使用它们的值,只有它们的ID.当再次使用查询并且结果集仍然"正确"时,将从第二级缓存查询属于id的值.

确实如此,但这是一个非常广泛的话题.特别是结果集仍然是"正确的"部分.

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

是的,如果没有L2缓存,查询缓存就没有意义,并且会大大减慢应用程序的速度.

查询缓存在哪里有意义,在哪里不行?

很难回答,通常当您执行相同的查询很多次并且查询参数的范围很低时(对于每组查询参数,创建新的查询缓存,其中所有记录ID都是结果).

Spring是否提供了比方法缓存更多的缓存可能性?

不,Spring或多或少只是你自己代码的粘合剂.

方法缓存没有链接到hibernate缓存.

Spring没有链接到Hibernate,所以......

但是:对于方法缓存,第二级是必要的,比如ehcache(也可以被hibernate使用)

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

可以使用方法缓存而无需数据库查询吗?

Spring与Hibernate无关.您可以缓存与数据库无关的计算.

如果使用ehcache作为二级缓存的hibernate和用于方法缓存的spring的ehcache,我可以使用相同的ehcache实例吗?是否有可能混淆了什么?

您可以使用与CacheManagerHibernate 相同的缓存配置来简化部署.只要缓存名称不重叠,它们就完全独立,即使在同一个管理器中工作也是如此.

当使用第一级缓存和二级缓存时,它们会混淆吗?在查询数据库时,结果来自哪里,第一级或第二级缓存?第一级缓存是否与二级缓存一起使用?

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

通过使用我提到的缓存可能混淆的任何其他东西?:-)

如上所述,抽象倾向于泄漏.但是当您更改数据库并且Hibernate不知道它时,最糟糕的问题就出现了.如果没有正确复制而进行群集也会让您头疼.最大的问题 - 通常不正确的缓存实际上会降低应用程序的速度(查询缓存在这里最危险).