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实例吗?是否有可能混淆了什么?
您可以使用与CacheManager
Hibernate 相同的缓存配置来简化部署.只要缓存名称不重叠,它们就完全独立,即使在同一个管理器中工作也是如此.
当使用第一级缓存和二级缓存时,它们会混淆吗?在查询数据库时,结果来自哪里,第一级或第二级缓存?第一级缓存是否与二级缓存一起使用?
他们只是工作,只要一些抽象不泄漏:-).当您通过主键查询时,首先检查L1(它更快),然后检查L2.
通过使用我提到的缓存可能混淆的任何其他东西?:-)
如上所述,抽象倾向于泄漏.但是当您更改数据库并且Hibernate不知道它时,最糟糕的问题就出现了.如果没有正确复制而进行群集也会让您头疼.最大的问题 - 通常不正确的缓存实际上会降低应用程序的速度(查询缓存在这里最危险).
归档时间: |
|
查看次数: |
12499 次 |
最近记录: |