Hibernate一级缓存和二级缓存详解
Hibernate是一种流行的基于Java的持久化框架,它提供了两种缓存机制:一级缓存和二级缓存。了解这两种缓存机制是非常重要的,因为它们可以极大地提高应用程序的性能。
一级缓存
一级缓存是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据。Hibernate中一级缓存的管理主要包括两个方面:当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。Session为应用程序提供了两个管理缓存的方法:evict(Object obj):从缓存中清除参数指定的持久化对象。clear():清空缓存中所有持久化对象。
二级缓存
二级缓存是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库。二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。
一级缓存和二级缓存的比较
| | 一级缓存 | 二级缓存 |
| --- | --- | --- |
| 存放数据的形式 | 相互关联的持久化对象 | 对象的散装数据 |
| 缓存的范围 | 事务范围,每个事务都有单独的第一级缓存 | 进程范围或集群范围,缓存被同一个进程或集群范围内的所有事务共享 |
| 并发访问策略 | 无需提供并发访问策略,因为每个事务都拥有单独的第一级缓存 | 必须提供适当的并发访问策略,来保证特定的事务隔离级别 |
| 数据过期策略 | 没有提供数据过期策略 | 须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间 |
| 物理存储介质 | 内存 | 内存和硬盘 |
启用缓存的方式
只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过Hibernate API,直接通过JDBC API来执行指操作。
结论
Hibernate的一级缓存和二级缓存都是非常重要的机制,它们可以极大地提高应用程序的性能。了解这两种缓存机制的特点和使用方法是非常重要的,以便更好地使用Hibernate框架。