• 缓存介于物理数据源于应用程序之间,是对数据库中的数据复制一份临时存在内存或者硬盘中的容器,其作用是为了减少应用程序对物理数据源的访问次数,从而提高了应用程序的运行性能。
  • 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
  • 什么数据适合放二级缓存中
    • 经常被访问
    • 改动不大
    • 数量有限
    • 不是很重要的数据,允许出现偶尔并发的数据
    • 只读的数据
    • 比如组织机构代码、列表信息等