用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/
我们在生产环境中使用它,使我们的生活变得更加轻松。
- buildSessionFactory()在hibernate 4中被弃用了吗?
- 如何在Hibernate中设置默认值
- Hibernate的两个configuration文件的目的是什么?
- org.hibernate.HibernateException:当“hibernate.dialect”未设置时,对DialectResolutionInfo的访问不能为null
- hibernate:刷新,执行,复制和刷新
- hibernate:如何解决“从X到Y更改实例的标识符”?
- 没有Hibernate Session绑定到线程,configuration不允许在这里创build非事务性的
- 在Hibernate中使用@Temporal注解是什么?
- Hibernate错误 – QuerySyntaxException:用户未映射