zoukankan      html  css  js  c++  java
  • 二级缓存和配置原理

    二级缓存是进程或集群范围内的缓存,可以被所有的Session共享

    二级缓存是可配置的插件

    01.二级缓存的配置使用(ehcache缓存)

       *1.引入如下jar包。

          ehcache-1.2.3.jar  核心库

          backport-util-concurrent.jar

          commons-logging.jar

       *2.配置Hibernate.cfg.xml开启二级缓存

      

     <property name="hibernate.cache.use_second_level_cache">true</property>

      *3.配置二级缓存的供应商

    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

    在大配置文件(hibernate.cfg.xml)中配置

    <class-cache    usage="read-write" class="cn.happy.entity.Student"/>
    <collection-cache usage="read-write" collection=""/>

    二级缓存保存数据原理:

    二级缓存测试:

    复制代码
    /**
         * 测试二级缓存
         */
            @Test
               public void testBulk(){
                   //获取的数据一样   
                   Session session = HibernateUtil.getSession();
                   Transaction tx=session.beginTransaction();
                   Dept dept = (Dept)session.get(Dept.class,1);
                   System.out.println(dept.getDeptName());
                   tx.commit();
                   HibernateUtil.closeSession();
    
                   System.out.println("===========================");
                   
                   //因为有二级缓存    所以 不显示SQL语句
                   Session session2 = HibernateUtil.getSession();
                   Transaction tx2=session2.beginTransaction();
                   Dept dept2 = (Dept)session2.get(Dept.class,1);
                   System.out.println(dept2.getDeptName());
                   tx2.commit();
                   HibernateUtil.closeSession();
                
               }
    复制代码

    运行结果:

    因为有二级缓存,都是查询部门名称,所以第二次查询不显示SQL语句

    测试查询缓存:

    list()方法

    复制代码
    /**
             * 测试查询缓存
             * 
             */
            @Test
            public void testCache(){
                session=HibernateUtil.getSession();
                Transaction tx=session.beginTransaction();
                Query query = session.createQuery("from Emp");
                
                //list()只能放数据   不能取出
                List<Emp> list = query.list();
                for (Emp emp : list) {
                    System.out.println(emp.getEmpName());
                }
                System.out.println("================================");
                
                //不显示SQL:上一步已经放入        二级缓存
                List<Emp> list1 = query.list();
                for (Emp emp : list1) {
                    System.out.println(emp.getEmpName());
                }
                
                System.out.println("================================");
        
             }
    复制代码

    运行结果

    首先放入数据,list()方法只能放入数据,不能取出数据,所以当运行查询语句,显示了两条SQL语句,这说明了ist()方法只能放入数据,不能取出数据,内存地址不同,所以显示两条SQL语句

     iterate()方法

    运行结果:

     

    iterate()方法可以取出数据,运行查询语句,显示两条SQL,但是这两条SQL是不一样的,印证了iterate()方法可以取出数据

  • 相关阅读:
    H3c实验室-(OSPF,Nat,STP,Dhcp,Acl)v.1)
    武科WUST-CTF2020“Tiki组 ”
    MRCTF 2020-“TiKi小组”
    mybatis-sqlite日期类型对应关系
    docker安装postgresql
    docker常用命令
    java sqlite docker,sqlite出错
    jenkins之SSH Publishers环境变量
    线程池(6)-submit与execute区别
    线程池(5)-停止线程池里的任务
  • 原文地址:https://www.cnblogs.com/ruixinyu/p/5842706.html
Copyright © 2011-2022 走看看