当前位置: 首页 > 面试题库 >

当hibernate使用各种缓存模式在二级缓存和数据库之间执行同步时?

陆昂然
2023-03-14
问题内容

我一直在浏览有关第二级高速缓存和查询高速缓存的hibernate文档,并留下了有关第二级高速缓存与数据库同步的问题,反之亦然。每个会话都可以定义自己的缓存模式,例如NORMAL,GET,PUT和REFRESH。2L缓存<->数据库同步是否会在所有情况下发生?如果是,何时会确切发生?在此先感谢。


问题答案:

大洋的降落

说到二级缓存,直接来

用法-指定缓存策略:事务性,读写,非严格读写或只读

就实体缓存而言,创建/更新/删除操作的预期调用顺序为:

删除:

lock(java.lang.Object, java.lang.Object)
evict(java.lang.Object)
release(java.lang.Object, org.hibernate.cache.CacheConcurrencyStrategy.SoftLock)

更新 :

lock(java.lang.Object, java.lang.Object)
update(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)
afterUpdate(java.lang.Object, java.lang.Object, java.lang.Object,org.hibernate.cache.CacheConcurrencyStrategy.SoftLock)

插入:

insert(java.lang.Object, java.lang.Object, java.lang.Object)
afterInsert(java.lang.Object, java.lang.Object, java.lang.Object)

集合缓存而言 ,所有修改操作实际上只会使条目无效。此处的调用顺序为:

lock(java.lang.Object, java.lang.Object)
evict(java.lang.Object)
release(java.lang.Object, org.hibernate.cache.CacheConcurrencyStrategy.SoftLock)

Nonstrict-R / w和R / W缓存

每当会话开始时,都会向其添加时间戳。(ST)每当在缓存中加载项目时,都会向其添加时间戳。(CT)现在,如果ST
<CT,则意味着会话早于缓存的项目,那么,如果我们在这个较旧的会话中查找缓存的项目,则Hibernate将不会在缓存中查找。取而代之的是,它将始终在数据库中查找,并因此以新的时间戳将项目重新加载到缓存中。

对于非严格读写

•从来没有锁定。

•因此,当实际上在数据库中更新对象时,在提交时(直到数据库完成提交),缓存具有旧对象,数据库具有新对象。

•现在,如果有任何其他会话在寻找对象,它将在缓存中查找并找到旧对象。(DIRTY READ

•但是,一旦提交完成,就会从高速缓存中逐出对象,以便下一个寻找对象的会话将不得不在数据库中查找。

读写

•一旦有人尝试更新/删除某个项目,该项目就会被软锁定在缓存中,因此,如果有其他会话试图查找该项目,则它必须进入数据库。

•现在,一旦更新结束并且提交了数据,就可以使用新数据刷新缓存并释放锁,这样其他事务现在就可以在CACHE中查找,而不必去数据库了。

•因此,没有机会进行脏读,并且任何会话几乎都将始终从数据库/缓存中读取已读数据。

总结一下:

ReadOnly cache只能读取和插入,不能执行更新/删除。性能最快。

Nonstrict Read Write Cache永远不会使用任何锁,因此总会有脏读的机会。但是,它总是从缓存中逐出该条目,以便任何后续会话始终引用DB。

Read Write cache使用锁,但是以异步方式,首先在TX中进行插入/更新/删除。当缓存条目被软锁定并且其他会话必须引用数据库时。一旦TX。完成后,将释放锁并更新缓存。(在事务外部)。在某些情况下,可重复读取可能会受到影响。

Transactional caches 显然,在同一事务中更新数据库和缓存,因此它相对于数据库始终处于一致状态。

Entity type 大部分已更新并且具有并发读取和更新的功能,读写缓存策略可能不是很有用,因为大多数读取将被转移到数据库中

查询缓存

需要在我们的hibernate.cfg.xml 1中启用以下属性

真正

此设置将创建两个新的缓存区域:

org.hibernate.cache.StandardQueryCache,保存缓存的查询结果

org.hibernate.cache.UpdateTimestampsCache,保存可查询表的最新更新时间戳。这些用于验证结果,因为它们是从查询缓存中提供的。

Query cache不在缓存中缓存实际实体的状态;它仅缓存标识符值和值类型的结果。因此,对于那些预期要作为查询结果缓存一部分进行缓存的实体,应始终将查询缓存与二级缓存结合使用



 类似资料:
  • 我一直在阅读hibernate文档,讨论二级缓存和查询缓存,并留下了关于二级缓存与DB同步的问题,反之亦然。每个会话都可以定义自己的缓存模式,比如正常、获取、放置和刷新。将2L缓存

  • 我们可以通过下面的简单算法实现该目的: 检查本地缓存的键(key); 如果本地缓存存在该键,则返回它的值; 如果本地缓存不存在该键,则尝试在分布式缓存中找; 如果分布式缓存存在该键,则返回它的值并把它添加到本地缓存; 如果分布式缓存不存在该键,则从数据库中获取,并添加到本地和分布式缓存,最后返回该值。 当在本地缓存服务器中缓存一些信息时,使用这种方式,它还将信息缓存到分布式缓存,但这一次,如果其他

  • 本文向大家介绍Hibernate中一级缓存和二级缓存之间的区别,包括了Hibernate中一级缓存和二级缓存之间的区别的使用技巧和注意事项,需要的朋友参考一下 Hibernate支持两种类型的缓存,一种是第一级缓存,另一种是第二级缓存。  一级缓存是会话级缓存,它始终与会话级对象关联。这种类型的缓存用于通过缓存对象的状态来最小化Db交互。 那不是在事务中完成每次修改之后更新,而是仅在事务结束时更新

  • 我很想知道Hibernate二级缓存是否可以在运行在两个不同JVM上的两个不同Hibernate会话之间共享。 我正在使用Hibernate 3.1和Ehcache来提供二级缓存,并且在Ehcache中。xml配置文件我们可以指定在磁盘上创建缓存的位置 因此,如果我现在在不同的JVM中打开两个不同的Hibernate会话,它们都指向同一个JVM,那么这将允许我在两个JVM之间共享二级缓存。 如果是

  • 问题内容: 我想在hibernate项目中使用二级缓存,但是我只对hibernate二级缓存了解一点,任何人都可以解释我应该如何在代码中使用它以及需要什么配置和.jar文件吗?我将这些设置设置为我的hibernate.cfg.xml文件 并添加这些jar文件, 我想知道我是否需要更改其他配置? 我怎么知道我的项目使用二级缓存? 如果只是设置此设置,hibernate将自动使用此设置,否则我必须在我

  • 当你使用本地(在内存中)缓存时,服务器可以缓存一些信息并快速地检索它,但是其他服务器不能访问这个缓存数据,他们需要到数据库中查询同样的信息。 如果你喜欢使用分布式缓存让其他服务器访问缓存的数据,由于它有一些序列化/反序列化和网络延迟开销,则需要注意:在某些情况下,它可能会降低性能。 缓存需要处理的另一个问题:缓存失效。 There are only two hard things in Compu