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

用Hibernate + Spring缓存-一些问题

戈巴英
2023-03-14
问题内容

我正在使用Spring 3和Hibernate
3.6开发Web应用程序。目前,我尝试了解Spring和Hibernate的缓存工作原理。我找到了一些有关使用Hibernate进行缓存的资源以及一些有关Spring的资源,现在我尝试将我的信息汇总在一起。我仍然对这两个框架都有一些疑问,如果有人可以回答或告诉我这里列出的事实是否正确,我将很高兴。

在大多数情况下,简短的回答(是/否)就足够了。我认为该列表对于想了解spring和hibernate缓存的工作原理的其他人也很有用。

General

1) Hibernate支持以下缓存:1级缓存,2级缓存,查询缓存

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

1st Level Cache

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

4) 为每个hibernate会话创建1级缓存。

5) 在第一级缓存中保存了什么?对象还是仅仅是它们的属性值?查询及其结果?

2nd Level Cache

6) 我发现:每个应用程序一次使用2级缓存。那不是假的吗?不是每次使用一次SessionFactory吗?和:多个sessionfactorys
=可能有多个第二级缓存?

7) 保存在第二级缓存中的内容:我认为仅属于一个记录的值,而不是对象本身。

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

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

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

11) 2级缓存在哪里有意义,在哪里呢?

12)
缓存模式:每个缓存模式是否提供不同的缓存策略?例如,在缓存模式为“只读”的情况下,是否不需要同步数据库和缓存?其他缓存模式是否提供同步?我认为同步必须由开发人员自己完成吗?

Query Cache

13)
查询缓存和二级缓存之间有什么区别?我认为:在查询缓存中保存结果集,但不保存其值,仅保存其ID。当再次使用查询并且结果集仍然“正确”时,从第二级缓存中查询属于这些ID的值

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

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

Spring

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

17) 方法缓存未链接到hibernate缓存

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

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

Getting mixed up

20) 如果将ehcache用作hibernate二级缓存,将ehcache用作spring用于方法缓存,我可以使用相同的ehcache实例吗?有机会混淆吗?

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

22) 通过使用我提到的缓存,还有什么可以混淆的吗?:-)

无论有什么问题,谢谢您的回答!:-)


问题答案:

Hibernate支持以下缓存:1级缓存,2级缓存,查询缓存

是。

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

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

1级缓存是每个Hibernate应用程序的一部分。

是。

为每个hibernate会话都创建了一级缓存。

是的,尽管您可以随时手动清除它。

一级缓存中保存了什么?对象还是仅仅是它们的属性值?查询及其结果?

它是会话期间获取的所有对象的映射,如果第二次通过id加载同一对象,则将从L1加载。

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

没错,通常每个应用程序(数据库)只有一个会话工厂,因此是捷径。

什么存储在第二级缓存中:我认为仅属于一个记录的值,而不是对象本身。

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

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

您无需手动管理L2,它会自动发生。

在更新二级缓存中的一个对象的值时,是否也可以更新与其关联的对象在缓存中的值?

往上看。

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

见上文-Hibernate会为您解决这个问题。您永远不会直接与L2交互。

2级缓存在哪里有意义,在哪里呢?

测量。在通过主键读取大量数据且读写因子很高的应用程序中,L2对您的性能有重大影响。

缓存模式:每个缓存模式是否提供不同的缓存策略?例如,在缓存模式为“只读”的情况下,是否不需要同步数据库和缓存?其他缓存模式是否提供同步?我认为同步必须由开发人员自己完成吗?

缓存模式可帮助Hibernate选择最佳策略进行缓存和无效化。例如,如果缓存是只读的,则Hibernate不会使它失效(或者它不会经常这样做)。但是,只读缓存(只读实体)当然会禁止任何更新。

查询缓存和二级缓存之间有什么区别?我认为:在查询缓存中保存结果集,但不保存其值,仅保存其ID。当再次使用查询并且结果集仍然“正确”时,将从第二级缓存中查询属于这些ID的值。

确实如此,但这是一个非常广泛的话题。特别是 结果集仍然是“正确的” 部分。

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

是的,没有L2缓存,查询缓存将毫无意义,并且会大大降低应用程序的速度。

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

很难回答的问题,通常是在您多次执行同一查询并且查询参数的范围很低时(对于每组查询参数,都会创建新的查询缓存,并以所有记录ID作为结果)。

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

不,Spring或多或少只是您自己代码的粘合剂。

方法缓存未链接到hibernate缓存。

Spring没有链接到Hibernate,所以…

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

L2是hibernate概念。如果要缓存方法,则需要 一些 基础缓存。随它去吧,是EhCache。当然,它必须是线程安全的。

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

Spring与Hibernate无关。您可能会缓存与数据库无关的计算。

如果将ehcache用于hibernate作为第二级缓存,将ehcache用于spring用于方法缓存,是否可以使用相同的ehcache-instance?有机会混淆吗?

您可以使用与CacheManagerHibernate
相同的缓存配置来简化部署。只要高速缓存名称不重叠,它们就完全独立,甚至可以认为是在同一管理器中工作的。

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

只要某些抽象不会泄漏,它们就可以工作:-)。当您通过主键查询时,首先检查L1(速度更快),然后检查L2。

还有其他什么可以通过使用我提到的缓存混淆的?:-)

参见上文,抽象趋向于泄漏。但是,当您更改数据库时,最严重的问题来了,而Hibernate对此一无所知。同样,没有正确复制的集群也会使您头疼。最大的问题-
错误的缓存通常会减慢应用程序的速度(查询缓存在这里是最危险的)。



 类似资料:
  • 主要内容:缓存,Hibernate 一级缓存,快照区Hibernate 是一款全自动 ORM 框架,它会在应用程序访问数据时,自动生成 SQL 语句并执行,因此开发人员不需要自己编写 SQL 语句,但这也造成它无法像 MyBatis 一样,能够直接从 SQL 层面严格控制其执行性能以及对数据库的访问频率,所以很容易出现性能不佳的情况。 为此,Hibernate 提供了多种性能优化手段(例如 HQL、懒加载策略、抓取策略以及缓存机制),其中缓存机制是

  • 问题内容: X项目包含以下部分: 一个。Spring Data存储库具有单独的方法,例如: b。hibernate方式也使用“ xobjects”缓存。 问题#1 由于有两种添加对象以缓存的方法,因此可能是同一对象出现2次的情况。如何更好地解决这个问题?例如,使用结果对象中的键。就像是: 键=“#result.id” 问题#2 我不想在调用“保存”方法时从缓存中逐出所有对象,但是我不确定当前的实现

  • 我使用SpringBoot1.2.5和JPA2来注释实体(并将hibernate作为JPA实现的底层)。 我想在该设置中使用二级缓存,因此实体被注释为 我还在application.properties中添加了以下内容: 在启动过程中,hibernate抱怨缺少,因此我也将此添加到pom中: 但是像这样的查询仍在触发DB查询,而不是使用缓存数据。 你知道少了什么吗?

  • 问题内容: 我正在尝试但未能成功在具有以下 依赖项的* Spring Data 和 Hibernate environmet中缓存查询: * 我的实体服务的Spring Data Repository(ServiceRepository)是 从中调用存储库的@Cacheable方法 我的缓存配置文件(jpa-context.xml)是 它的灵感来自spring-data-jpa-examples

  • 我使用Spring Boot 1.4.1和spring-boot-starter-data-jpa 当查询我的自定义方法时,比如'find byname(String name)',它不是缓存。

  • 我一个新的使用Hibernate缓存(一级,二级和查询缓存)。 我的项目是使用SpringMVC和JPA配置的。 我正在使用下面的JUnit测试用例测试一级缓存。 我的实体类定义为: 如果默认情况下启用了一级缓存,则应该执行一次本机查询。但我在执行此查询时得到以下结果: 以下是我的持久性相关配置: 有人能帮我解决一个问题或者我做错了什么吗? 提前感谢!