【发布时间】:2011-07-21 07:07:15
【问题描述】:
我正在使用 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) 我发现:二级缓存在每个应用程序中使用一次。那不是假的吗?不是每个SessionFactory 使用一次吗?并且:多个 sessionfactorys = 可能有多个二级缓存?
7) 二级缓存中保存的内容:在我看来只是属于一条记录的值,而不是对象本身。
8)在二级缓存中存储一条记录的值时,是否也可以使用它存储相关值(来自通过外键连接的对象)?
9)在二级缓存中更新一个对象的值时,缓存中与之相连的对象的值是否也可以更新?
10) 当对象的值发生变化时,如何更新二级缓存?冲洗?我可以只更新部分缓存还是必须更新整个缓存?
11) 二级缓存在哪里有意义,在哪里没有意义?
12)缓存模式:每种缓存模式是否提供不同的缓存策略?例如,对于“只读”缓存模式,不需要同步数据库和缓存吗?其他缓存模式是否提供同步?我认为必须由开发者自己完成同步?
Query Cache
13) 查询缓存和二级缓存有什么区别?在我看来:在查询缓存中,结果集被保存,但没有保存它们的值,只是保存了它们的 id。当再次使用查询,结果集仍然“正确”时,从二级缓存中查询属于ids的值
14) 对于查询缓存,必须使用二级缓存吗?
15) 查询缓存在哪里有意义,在哪里没有意义?
Spring
16) Spring 是否提供了比方法缓存更多的缓存可能性?
17) 方法缓存未链接到休眠缓存
18) 但是:对于方法缓存,第二级是必要的,例如 Ehcache(也可以被休眠使用)
19)可以在没有数据库查询的情况下使用方法缓存吗?
Getting mixed up
20) 如果将ehcache 用于hibernate 作为二级缓存,将Ehcache 用于spring 用于方法缓存,我可以使用相同的Ehcache 实例吗?有没有可能搞混?
21) 使用一级缓存和二级缓存时,会不会混淆?查询数据库时,结果是从哪里来的,一级缓存还是二级缓存?一级缓存可以和二级缓存一起使用吗?
22) 还有什么可以通过使用我提到的缓存来混淆的吗? :-)
感谢您的回答,无论是什么问题! :-)
【问题讨论】:
标签: hibernate spring caching ehcache second-level-cache