首页 文章

用Hibernate Spring缓存 - 一些问题!

提问于
浏览
60

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

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

General

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

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

1st Level Cache

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

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

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

2nd Level Cache

6) 我发现:每个应用程序使用ONCE二级缓存 . isn 't that false? isn'它是否每次sessionfactory使用ONCE?和:多个sessionfactorys =多个第二级缓存可能吗?

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

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

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

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

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

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

Query Cache

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

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

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

Spring

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

17) 方法缓存未与hibernate缓存相关联

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

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

Getting mixed up

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

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

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

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

2 回答

  • 71

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

    是 .

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

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

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

    是 .

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

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

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

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

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

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

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

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

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

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

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

    往上看 .

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

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

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

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

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

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

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

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

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

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

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

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

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

    不,Spring或多或少只是你自己代码的 Binders .

    方法缓存未与hibernate缓存相关联 .

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

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

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

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

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

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

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

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

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

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

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

  • 2

    关于Spring和二级缓存,有一个很酷的开源项目,可以帮助我使用2L缓存:

    例如:http://code.google.com/p/ehcache-spring-annotations/

    我们在 生产环境 环境中使用它,它使我们的生活更加轻松 .

相关问题