(1)问:Hibernate支持一级缓存、二级缓存和查询缓存对吗
答:是的
(2)问:spring本身仅仅支持方法缓存
答:是的,spring3.1引入了在方法上的基于注解的新的缓存抽象
(3)问:Hibernate应用的每一个部分都支持一级缓存
答:是的
(4)问:每一个Hibernate-Session都会创建一个一级缓存
答:是的,你可以手动的清楚它
(5)问:在一级缓存中存储的是什么?对象或者仅仅是属性的值?
答:在Session生命周期内获取到的所有对象的一个map集合,如果第二次通过id获取相同的对象,它将从一级缓存中获取。
(6)问:我发现每个应用使用二级缓存一次,对吗?是每一个Sessionfactory使用一次吗?
答:是的,通常情况下一个应用只有一个Session factory
(7)问:在二级缓存中存储的是什么,我的观点是一条记录的值,而不是对象本身
答:和一级缓存中存储的内容是一样的,但是存活的更久,二级缓存通常由更强大的缓存支持而一级缓存仅仅是一个map(甚至都不是线程安全的)。它存储了所有的实体,包括懒加载的关系
(8)问:当在二级缓存中存储一条记录的值的时候,也存储其他相关的值吗(外键相关的值)?
答:你不需要手动来做,程序会自动完成
(9)问:当在二级缓存中更新一个对象的值的时候,同样也更新在缓存中的和这个对象关联的值吗?
答:同上
(10)问:当我在缓存中对象的值改变的时候,我们怎么更新二级缓存的值,flush?我仅仅更新缓存的一部分还是更新整个缓存?
答:Hibernate会为你做好配置,你永远也不需要直接和二级缓存交互
(11)问:二级缓存在什么地方有意义,在什么地方没有意义?
答:通过主键经常读的数据,read-to-write因数非常高的操作
(12)问:缓存模式:每一个缓存模式都提供了不同的缓存策略吗?例如,read-only模式没有数据库同步,缓存有必要吗?其他换粗模式提供同步吗?同步必须由开发人员自己来做吗?
答:缓存模式帮助Hibernate选择缓存和失效的最好的策略,例如是read-only模式,Hibernate就不需要关心它的失效问题,但是这种模式将会禁止任何形式的更新。
(13)问:二级缓存和查询缓存的区别是什么,我的观点:在查询缓存中结果集被保留,但是没有其他的值,仅仅是他们的id。当再次使用查询的时候,并且结果集依然正确的情况下,属于这些id的值从二级缓存中获取
答:准确但是很广的问题
(14)问:对于查询缓存来说,二级缓存必须使用吗?
答:没有二级缓存,查询缓存会拖慢整个系统
(15)问:查询缓存在什么地方有用,在什么地方没有用?
答:很难回答的问题,通常讲当执行多次相同的查询,查询的参数比较少的时候。
(16)问:spring提供了出方法缓存的其他更多的缓存选择吗?
答:没有,spring或多或少的都会和你的代码拟合
(17)问:方法缓存和Hibernate缓存没有关系
答:spring没有和Hibernate连在一起
(18)问:但是对于方法缓存来说,二级缓存是必须具备的(比如ehcache,同样也被Hibernate使用)
答:二级缓存是Hibernate的概念,如果你想缓存方法,你需要一些重要的缓存,可以使用ehcache,但是必须是线程安全的。
(19)问:方法缓存可以在没有数据库查询的条件下使用吗?
答:spring和Hibernate没有关系,你可以缓存计算结果,这和数据库没有关系
(20)问:如果我在Hibernate中使用了ehcache作为二级缓存,同样在spring中也是使用ehcache,那么我可以使用同一个实例吗?有没有可能混合呢?
答:你或许会使用同一个CacheManager,使用Hibernate一样的缓存配置,只要名字不用,他们就是完全独立的,即使在同一个manager里边。
(21)问:当我使用一级缓存和二级缓存的时候,他们有没有可能混合呢?当查询数据库的时候,结果从哪里来的呢,一级缓存还是二级缓存?一级缓存和二级缓存是一起使用的吗?
答:只要一些抽象不糊泄露,就能正常工作。当你根据主键查询的时候,首先查询一级缓存(更快),其次是二级缓存
(22)问:我使用缓存会导致其他的混合吗?
答:上边抽象可能导致泄露,最坏的情况是数据库更改了而Hibernate不知道
原文地址:http://stackoverflow.com/questions/5405417/caching-with-hibernate-spring-some-questions
参考资料:http://stackoverflow.com/questions/474159/hibernate-second-level-cache-with-spring
http://www.journaldev.com/2980/hibernate-ehcache-second-level-caching-example-tutorial