zoukankan      html  css  js  c++  java
  • 一级缓存 和二级缓存

    hibernate默认开启一级缓存,其实和我们的mybatis的一级缓存一样的
    默认保留级别是session级别。session关闭我们的保存的缓存消失,否则一直存在,想想我们之前修改的数据。
    看这个实验
    Student stu=(Student) session.get(Student.class, 4);
    System.out.println(stu.getStuName());
    stu.setStuName("xiaoming2");
    Transaction tx=session.beginTransaction();
    tx.commit();
    Student stu2=(Student) session.get(Student.class, 4);
    System.out.println(stu2.getStuName());

    我们在这里需要使用2及缓存
    ehcache-core-2.4.3.jar这个东西非常好用的。注意并不是属于hibernate的东西。也就是使用的别的地方的时候也可以使用

    首先在src下创建ehcache.xml文件,注意这个文件我们可以在它的jar包中找到的
    <diskStore path="java.io.tmpdir"/>这句话表明了缓存默认会找到一个输出路径的
    maxElementsInMemory可以存放对少个缓存对象。
    eternal--是否是永久的不会被清除的
    timeToIdleSeconds---多少秒清除
    timeToLiveSeconds--存活多少秒 一般设置比上面要长一点时间。
    overflowToDisk--如果超过了最多生存对象将被写入到硬盘上


    首先我们看一级缓存

    Student stu=(Student) session.get(Student.class, 4);
    System.out.println(stu.getStuName());
    Student stu2=(Student) session.get(Student.class, 4);
    System.out.println(stu.getStuName());
    发现sql语句执行了一次,在没关闭session之前,一级缓存是一直存在的。


    我们做实验2
    HibernateUtil util=new HibernateUtil();
    Session session=util.getSession();
    Student stu=(Student) session.get(Student.class, 4);
    System.out.println(stu.getStuName());
    session.close();//关闭session,在下边重新获得一个新的session
    Session session2=util.getSession();
    Student stu2=(Student) session2.get(Student.class, 4);
    System.out.println(stu.getStuName());

    我们现在就来配置
    添加关于cache的jar包
    首先在src下配置ehcache.xml文件,之前就说过了
    第二在hibernate配置文件中添加如下话
    <property name="cache.use_second_level_cache">true</property>
    <property name="cache.use_query_cache">true</property>
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
    第三在需要换的的配置文件中
    <cache usage="read-only" region="sampleCache1"/>

    重新测试实验,实验成功
    需要注意的是,我们不可以修改里边的数据了


    这里需要注意的是,我们在ehcahe文件中看到的,二级混存保存的是对象信息。那如果我们查询的东西并不是对象呢?
    我们可以使用查询缓存。
    查询缓存会把我们不是对象的数据包装成为对象使用
    我们来看实验:
    HibernateUtil util=new HibernateUtil();
    Session session=util.getSession();
    Query query=session.createQuery("select stuName from Student");
    System.out.println(query.list().get(0));
    session.close();
    Session session2=util.getSession();
    Query query2=session2.createQuery("select stuName from Student");
    System.out.println(query2.list().get(0));

    发现还是多次查询了数据库
    怎么办?
    其实我们刚才在配置文件添加的这个东西
    <property name="cache.use_query_cache">true</property>
    就是用于开启查询缓存
    别的地方都不需要改变
    HibernateUtil util=new HibernateUtil();
    Session session=util.getSession();
    Query query=session.createQuery("select stuName from Student");
    query.setCacheable(true); //这里就是使用二级查询缓存
    System.out.println(query.list().get(0));
    session.close();
    Session session2=util.getSession();
    Query query2=session2.createQuery("select stuName from Student");
    query2.setCacheable(true);
    System.out.println(query2.list().get(0));

  • 相关阅读:
    委托与事件
    JSON
    JavascriptBoolean运算符
    SQL执行字符串
    ref和out与SQL中的output
    早绑定、晚绑定
    浅复制和深复制
    Android Fragments 详细使用
    Android 两种为自定义组件添加属性的使用方法和区别
    Gallery 3D+倒影 滑动切换图片示例(转)
  • 原文地址:https://www.cnblogs.com/loongss/p/5805199.html
Copyright © 2011-2022 走看看