【问题标题】:entityManager.flush() will clear the second level cache?entityManager.flush() 会清除二级缓存吗?
【发布时间】:2019-07-06 09:59:37
【问题描述】:

有点混淆entityManger.flush();

用于批处理的休眠文档

https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/batch/Batching.html

“当你使新对象持久化时,定期对会话使用flush()和clear()方法,来控制一级缓存的大小。”

我正在研究 Spring Boot 数据 jpa。

第一个疑问是Restful应用的一级缓存是否开启?

entityManager.flush()可以清空二级缓存吗?

entityManger.flush()System.gc()相似;

【问题讨论】:

  • 没有。为什么会这样?
  • 我认为这个想法是调用 flush() 以确保您不会丢失到目前为止所做的任何更改,然后 clear() 从持久性上下文中卸载实体

标签: java hibernate spring-boot jpa spring-data-jpa


【解决方案1】:

1) 第一级缓存是为每个开始的事务创建的,因此它始终存在于每个事务方法中。

2) entityManager.flush(),不清除二级缓存。它也不会清除一级缓存,它会强制将当前事务中所做的任何更改推送到物理数据库中。

3) entityManger.flush() 是否与System.gc() 相似?不,所有对象仍然在堆上,甚至仍然由当前持久性上下文管理。

【讨论】:

  • docs.jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/… 说“当你使新对象持久化时,定期对会话使用方法 flush() 和 clear() 来控制一级缓存的大小”
  • 这一切都取决于事务方法中发生的事情,但主题太宽泛了.. 一般来说,如果您在一个事务中查询持久性和更新很多内容,您应该使用这些方法,但要再次使用..不过分
  • 一级缓存与“会话”对象相关联。缓存对象的范围是一个会话。一旦会话关闭,缓存的对象就永远消失了。在一个安静的 Web 服务中,它是无状态的。那么当有会话时,一级缓存是如何工作的呢?
  • 它们并没有消失,它们与持久化上下文分离,但仍然是堆上的普通对象,可以随时合并回新会话
  • Restful Webservice 有会话吗?如果没有会话,那么一级缓存如何工作?
猜你喜欢
  • 2017-07-05
  • 2014-05-29
  • 2011-08-31
  • 1970-01-01
  • 2011-02-09
  • 2015-05-06
  • 1970-01-01
  • 2011-07-21
  • 2014-08-12
相关资源
最近更新 更多