Hibernate学习16(二级缓存)

一级不会跨Session Session关闭缓存消失
二级缓存 SessionFactory缓存
  • 1.内置缓存:映射文件保存

  • 2.外置缓存:存放缓存的数据

适合放的数据:
  • 1.很少修改的

  • 2.不是很重要,有并发

步骤:
  • 1.加入jar(都在hibernate文件中)
ehcache
  • 2.加入ehcache.xml配置文件 (都在hibernate文件中)

    
    
    


   
    

   
   
   
    
        
        
        
     
     -->

  • 3.hibernate.cfg.xml 配置
    1).开启缓存
    2).配置二级缓存产品(ehcache)
    3).配置需要缓存持久化类 和缓存策略
        
        true
        
        org.hibernate.cache.EhCacheRegionFactory
        
        true
        
        
        
        
        
        
        
        
         
        
        
        
        
        
夸SessionFactory缓存调用
    /**
     * 二级缓存
     * 一级不会跨Session Session关闭缓存消失
     * 二级缓存SessionFactory 缓存
     *      1.内置缓存:映射文件保存
     *      2.外置缓存:存放缓存的数据
     * 
     * 适合放的数据:
     * 1.很少修改的
     * 2.不是很重要,有并发
     * 
     * 步骤
     * 1.加入jar(都在hibernate文件中)
     * 2.加入ehcache.xml配置文件 (都在hibernate文件中)
     * 3.hibernate.cfg.xml 配置
     *      1).开启缓存 
     *      2).配置二级缓存产品(ehcache)
     *      3).配置需要缓存持久化类 和缓存策略
     * */
    public static void cache() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Employee employee1=session.get(Employee.class, 1);
        System.out.println(employee1.getName());
        
        transaction.commit();
        session.close();
        session=null;
        transaction=null;
        
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
        Employee employee2=session.get(Employee.class, 1);
        System.out.println(employee2.getName());
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
集合二级缓存
  • 在hibernate.cfg.xml 配置要配置元素中的持久化类配置二级缓存
  • 在hibernate.cfg.xml 配置集合
查询缓存 默认无效
  • 1.默认情况下 设置的缓存对HQL QBC查询时无效的
步骤:
  • 1.在hibernate.cfg.xml文件声明开启查询缓存

  • 2.显示调用query.setCacheable(true);

  • 3.查询缓存依赖二级缓存

    /**
     * 集合二级缓存 查询缓存
     * 1.默认情况下 设置的缓存对HQL QBC查询时无效的
     * 步骤:
     * 1.在hibernate.cfg.xml文件声明开启查询缓存
     * 2.显示调用query.setCacheable(true);
     * 3.查询缓存依赖二级缓存
     * */
    public static void cacheQuery() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        String hql = "FROM Employee ";
        Query query = session.createQuery(hql);
        query.setCacheable(true);
        
        List es = query.list();//第一次查询
        System.out.println(es.size());
        List es2 = query.list();//二次查询
        
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
更新时间戳缓存
    /**
     * 更新时间戳缓存
     * 缓存被修改时 更新缓存
     * */
    public static void cacheData() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        String hql = "FROM Employee ";
        Query query = session.createQuery(hql);
        query.setCacheable(true);
        
        List es = query.list();//第一次查询
        Employee e = session.get(Employee.class, 1);
        e.setName("我改了");
        System.out.println(es.size());
        List es2 = query.list();//二次查询
        
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

你可能感兴趣的:(Hibernate学习16(二级缓存))