- 缓存介于物理数据源于应用程序之间,是对数据库中的数据复制一份临时存在内存或者硬盘中的容器,其作用是为了减少应用程序对物理数据源的访问次数,从而提高了应用程序的运行性能。
- hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到则把这称为缓存命中。这避免了大量发送sql语句到数据库查询的性能损耗。
- session缓存,事务缓存:hibernate内置的,不能卸除。只能被当前session对象访问。缓存的生命周期依赖于session的生命周期。当session被关闭后,缓存也就结束生命周期。
配置EHCache(二级缓存提供商)
- 默认配置文件名:ehcache.xml,分别要配置默认的缓存设置和具体的缓存设置
- 在hibernate.cfg.xml中开启二级缓存
- 在要开启二级缓存的类的映射文件中开启二级缓存
测试:用同一个工厂开两个session,第一个查询到的对象将存放在sessionFactory,即使第一个session关闭了,该对象已然存在于sessionFactory中,第二个session可以直接在缓存中获取到。
public void testCache2(){ //第一次用sql Session session1=sessionFactory.openSession(); session1.beginTransaction(); Class c=(Class)session1.get(Class.class, Long.valueOf(1)); System.out.println(c.getName()); session1.getTransaction().commit(); session1.close(); //第二次查询时使用到了二级缓存,直接从SessionFactory里拿 Session session2=sessionFactory.openSession(); session2.beginTransaction(); Class c2=(Class)session2.get(Class.class, Long.valueOf(1)); System.out.println(c2.getName()); session2.getTransaction().commit(); session2.close(); System.out.println(c==c2); }
- 代码实例:hibernateEHCache
- 什么数据适合放二级缓存中
- 经常被访问
- 改动不大
- 数量有限
- 不是很重要的数据,允许出现偶尔并发的数据
- 只读的数据
- 比如组织机构代码、列表信息等