JPA有两种类型的缓存:

  • EntityManager自身就是一种缓存。事务中从数据库获取的和写入到数据库的数据会被缓存(什么样的数据会被缓存,在后面有介绍)。在一个程序中也许会有很多个不同的EntityManager实例,每一个实例运行着不同的事务,拥有着它们自己的缓存。

  • 当EntityManager提交一个事务后,它缓存的所有数据就会被合并到一个全局的缓存中。所有的EntityManager都能够访问这个全局的缓存。

全局缓存被称为二级缓存(Level 2 Cache),而EntityManager拥有的本地缓存被称为一级缓存(Level 1 Cache)。所有的JPA实现都拥有一级缓存,并且对它没有什么可以调优的。而二级缓存就不同了:大多数JPA实现都提供了二级缓存,但是有些并没有把启用它作为默认选项,比如Hibernate。一旦启用了二级缓存,它的设置会对性能产生较大的影响。

只有当使用实体的主键进行访问时,JPA的缓存才会工作。这意味着,下面的两种获取方式会将获取的结果放入到JPA的缓存中:

  • 调用find()方法,因为它需要接受实体类的主键作为参数
  • 调用实体类型的getter方法来得到关联的实体类型,本质上,获取关联的实体对象也是通过关联对象的主键得到,因为在数据库的表结构中,存放的是该关联对象的外键信息。

那么当EntityManager需要通过主键或者关联关系获取一个实体对象时,它首先会去二级缓存中寻找。如果找到了,那么它就不需要对数据库进行访问了。

链接

数据库性能最佳实践 - JPA缓存

最新文章

  1. MySQL数据库权限操作指南
  2. 学习WPF——WPF布局——了解布局容器
  3. ajax该什么时候用
  4. imx6 kernel clock
  5. php之面向对象
  6. iOS取证将如漫漫长夜
  7. 集成Spring后HibernateTemplate实现分页
  8. RedHat7 部署ELK日志分析系统
  9. cocos2d 制作动态光晕效果基础 —— blendFunc
  10. hdu4638Group
  11. NOI冲刺计划
  12. oracle编译 失效对象方式
  13. BAT清理垃圾
  14. Oracle EBS-SQL (PO-10):检查过期采购未接收订单.sql
  15. 04737_C++程序设计_第6章_继承和派生
  16. matlab字符串操作
  17. [补档]暑假集训D7总结
  18. Luogu CF451E Devu and Flowers 题解报告
  19. 【汇总目录】Git
  20. C++标准库algorithm

热门文章

  1. kafka入门之broker-集群管理
  2. AgileConfig-轻量级配置中心 1.1.0 发布,支持应用间配置继承
  3. Intel s2600系列做虚拟化需要注意的item
  4. springmvc<三> 异常解析链与视图解析链
  5. 第15.40节、PyQt(Python+Qt)实战:moviepy实现MP4视频转gif动图的工具
  6. 第十一章、Designer中主窗口QMainWindow类
  7. PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象dockNestingEnabled属性
  8. 团队作业part5--测试与发布(Alpha版本)
  9. 冲刺Day5
  10. springcloud gateway解决跨域问题