Hibernate的缓存机制
一、缓存的范围分类
1、事务范围(单Session 即一级缓存)
事务范围的缓存只能被当前事务访问,每个事务独有各自的缓存,缓存的数据通常采用相互关联的对象形式,缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束,事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围。
2、应用范围(单SessionFactory 即二级缓存)
应用程序的缓存可以被应用范围内的所有事务共享访问,缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束,应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围。
3、集群范围(多SessionFactory)
在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点中,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式。
二、一级缓存
1、使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率;(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据。如果有数据就不查询数据库,直接从缓存中获取数据);
2、Hibernate中的一级缓存,也叫做session缓存,它可以在session范围内减少数据库的访问次数,只在session范围内有效,session关闭,一级缓存失败;
3、一级缓存的特点,只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显;
4、当调用session的save、get、load、list、iterator等方法的时候,都会把对象放入到session缓存中;
5、session的缓存是由hoernate维护的,用户不能操作缓存内容;如果想要操作缓存内容,必须通过hibernate提供的evict、clear方法操作;
6、缓存相关的方法在什么情况下可以使用呢?在批量操作下使用:
session.flush();让一级缓存与数据库保持同步
session.evict();清空一级缓存中指定的对象
session.clear();清空一级缓存中所有的对象
三、二级缓存
基于应用程序级别的缓存,作用在SessionFactory范围内,可以跨多个session,即不同的session都可以访问缓存。Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架,如果用户想用二级缓存,只需要在hibernate的配置文件中配置即可,不想用,直接删除,不影响代码。
1、在执行各种条件查询时,如果所获得的结果为实体对象的集合,那么就会把所有的数据对象根据ID放入到二级缓存中。
2、当Hibernate根据ID访问数据对象的时候,首先会从session一级缓存中查找,如果查不到并且配置了二级缓存,那么会从二级缓存中查找,如果还是查不到,就会查询数据库,把结果按照ID放入到缓存中。
3、删除、更新、增加数据的时候,同时更新缓存。
四、引入第三方缓存(如ehcache等)
网友评论