Hibernate(六)--缓存策略
缓存:
缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问中间层,orm在查询数据时,首先会根据自身的缓存管理策略,在缓存中查找相关数据,如果发现所需的数据,则直接将此数据作为结果加以使用,从而避免数据库调用性能的开销,而相对内存操作而言,数据库调用是一个代价高昂的过程。
查找数据时,先去缓存中查找是否有此数据,如果有此数据,则直接使用缓存中的数据,不再从数据库中查询,否则去数据库中查询,减少与数据库的交互。
hibernate缓存包括两大类:一级缓存和二级缓存
hibernate一级缓存又被称为“session的缓存”。session缓存是内置的,不能被卸载,是事务范围的缓存,在一级缓存中,持久化类的每个实例都具有唯一的oid。
hibernate二级缓存又称为“sessionfactory的缓存”,由于sessionfactory对象的生命周期和应用程序的整个过程对应,因此hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别,第二级缓存是可选的,是一个可配置的插件,默认下sessionfactory不会启用这个插件。
一级缓存(session):
第一次通过id=1获取对象的时候,session中是没有对应缓存对象的,所以会在"log1"后出现sql查询语句。
第二次通过id=1获取对象的时候,session中有对应的缓存对象,所以在"log2"后不会出现sql查询语句
二级缓存(sessionfactory):
hibernate本身不提供二级缓存,都是使用第三方的二级缓存插件,这里使用的是 ehcache提供的二级缓存, 在hibernate.cfg.xml中开启二级缓存的配置
使用不同的session,都去获取id=1的category,只会访问一次数据库。
因为第二次获取虽然没有从第二个session中拿到缓存,但是从sessionfactory中拿到了category缓存对象
ehcache.xml配置文件
result: