zoukankan      html  css  js  c++  java
  • hibernate框架学习之二级缓存(测试用例)

    HqlDemoApp.java
    package cn.itcast.h3.query.hql;
    
    import java.io.Serializable;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import cn.itcast.h3.query.hql.vo.StudentModel;
    import cn.itcast.h3.query.hql.vo.TeacherModel;
    import cn.itcast.util.HibernateUtil;
    
    public class HqlDemoApp {
        //测试是否存在二级缓存
        void testHasCache(){
            Session s = HibernateUtil.getSession();
            //读取数据,并且将数据加载入当前Session的一级缓存,
            //同时加载到当前SessionFactory的二级缓存
            TeacherModel tm1 = (TeacherModel) s.get(TeacherModel.class, 3L);
            System.out.println(tm1);
            //读取的是当前Session的一级缓存数据
            TeacherModel tm2 = (TeacherModel) s.get(TeacherModel.class, 3L);
            System.out.println(tm2);
            s.close();
            System.out.println("-----------------------------");
            Session s2 = HibernateUtil.getSession();
            //读取的是二级缓存的数据
            TeacherModel tm3 = (TeacherModel) s2.get(TeacherModel.class, 3L);
            System.out.println(tm3);
            TeacherModel tm5 = (TeacherModel) s2.get(TeacherModel.class, 3L);
            System.out.println(tm5);
            s2.close();
            System.out.println("--------------------------");
            Session s3 = HibernateUtil.getSession();
            //读取的是二级缓存的数据
            TeacherModel tm4 = (TeacherModel) s3.get(TeacherModel.class, 3L);
            System.out.println(tm4);
            s3.close();
            
        }
        //测试SQL查询数据是否加载二级缓存
        void testQueryToCache(){
            Session s = HibernateUtil.getSession();
            Query q = s.createQuery("from TeacherModel");
            q.list();
            Query q2 = s.createQuery("from TeacherModel");
            q2.list();
            s.close();
            System.out.println("--------------------");
            Session s3 = HibernateUtil.getSession();
            TeacherModel tm4 = (TeacherModel) s3.get(TeacherModel.class, 3L);
            System.out.println(tm4);
            s3.close();
        }
        //测试SQL查询是否读取二级缓存数据
        void testQueryToCache2(){
            Session s3 = HibernateUtil.getSession();
            TeacherModel tm4 = (TeacherModel) s3.get(TeacherModel.class, 3L);
            System.out.println(tm4);
            s3.close();
            System.out.println("--------------------");
            Session s = HibernateUtil.getSession();
            Query q = s.createQuery("from TeacherModel where uuid = :uuid");
            q.setLong("uuid", 3L);
            TeacherModel tm = (TeacherModel) q.uniqueResult();
            System.out.println(tm);
            s.close();
            
        }
        //测试保存数据是否影响二级缓存数据
        void testSaveToCache(){
            //保存数据
            Session s3 = HibernateUtil.getSession();
            Transaction t = s3.beginTransaction();
            TeacherModel tm = new TeacherModel();
            tm.setTeacherName("aaa");
            tm.setNick("bbb");
            
            Serializable uuid = s3.save(tm);
            
            t.commit();
            s3.close();
            
            System.out.println("--------------------");
            
            Session s = HibernateUtil.getSession();
            TeacherModel tm4 = (TeacherModel) s.get(TeacherModel.class, uuid);
            System.out.println(tm4);
            s.close();
            
        }
        //测试删除数据是否影响二级缓存数据
        void testDeleteToCache(){
            //保存数据
            Session s3 = HibernateUtil.getSession();
            Transaction t = s3.beginTransaction();
            TeacherModel tm = (TeacherModel) s3.get(TeacherModel.class, 6L);
            
            s3.delete(tm);
            
            t.commit();
            s3.close();
            
            System.out.println("--------------------");
            
            Session s = HibernateUtil.getSession();
            TeacherModel tm4 = (TeacherModel) s.get(TeacherModel.class, 6L);
            System.out.println(tm4);
            s.close();
            
        }
        //测试更新数据是否影响二级缓存数据
        void testUpdateToCache(){
            //保存数据
            Session s3 = HibernateUtil.getSession();
            Transaction t = s3.beginTransaction();
            TeacherModel tm = (TeacherModel) s3.get(TeacherModel.class, 4L);
            tm.setTeacherName("hahahh");
            s3.update(tm);
            t.commit();
            s3.close();
            
            System.out.println("--------------------");
            
            Session s = HibernateUtil.getSession();
            TeacherModel tm4 = (TeacherModel) s.get(TeacherModel.class, 4L);
            System.out.println(tm4);
            s.close();
            
        }
        //测试集合操作二级缓存
        void testCollectionToCache(){
            Session s = HibernateUtil.getSession();
            TeacherModel tm = (TeacherModel) s.get(TeacherModel.class, 1L);
            System.out.println(tm.getStudents());
            s.close();
            System.out.println("----------------");
            Session s2 = HibernateUtil.getSession();
            TeacherModel tm2 = (TeacherModel) s2.get(TeacherModel.class, 1L);
            System.out.println(tm2.getStudents());
            s2.close();
        }
        //DML影响二级缓存的操作
        void testDMLToCache(){
            Session s = HibernateUtil.getSession();
            Transaction t = s.beginTransaction();
            StudentModel tm = (StudentModel) s.get(StudentModel.class, 3L);
            System.out.println(tm);
            Query q = s.createQuery("update TeacherModel set teacherName=:teacherName where uuid = :uuid");
            q.setString("teacherName", "测试更新1");
            q.setLong("uuid", 4L);
            q.executeUpdate();
            t.commit();
            s.close();
            
            Session s2 = HibernateUtil.getSession();
            StudentModel tm2 = (StudentModel) s2.get(StudentModel.class, 3L);
            System.out.println(tm2);
            s2.close();
        }
        //查询缓存
        void testQueryToCache3(){
            Session s2 = HibernateUtil.getSession();
            Query q2 = s2.createQuery("from TeacherModel where uuid=:uuid");
            //本次查询开启查询缓存
            q2.setCacheable(true);
            System.out.println(q2.list());
            s2.close();
            System.out.println("-------------");
            Session s = HibernateUtil.getSession();
            Query q = s.createQuery("from TeacherModel where uuid = 2");
            q.setCacheable(true);
            System.out.println(q.list());
            s.close();
        }
        public static void main(String[] args) {
            new HqlDemoApp().testQueryToCache3();
        }
    }

    ehcache.xml

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
        <diskStore path="d:cache-data"/>
        <cache
                name="c1"
                maxElementsInMemory="10"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="1200"
                overflowToDisk="true"
                maxElementsOnDisk="10000000"
                diskPersistent="false"
                diskExpiryThreadIntervalSeconds="120"
                memoryStoreEvictionPolicy="LRU"
                />
        <defaultCache
                maxElementsInMemory="10"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="1200"
                overflowToDisk="true"
                maxElementsOnDisk="10000000"
                diskPersistent="false"
                diskExpiryThreadIntervalSeconds="120"
                memoryStoreEvictionPolicy="LRU"
                />
    </ehcache>

    hibernate.cfg.xml

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <!--数据库连接的配置-->
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/h3</property>
            <property name="connection.username">root</property>
            <property name="connection.password">root</property>
            
            <!--方言的配置,用于区别使用何种数据库-->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            
            <!--可选配置项中,开发过程常用设置-->
            <property name="show_sql">true</property>
            <property name="format_sql">false</property>
            <!-- 开启二级缓存功能 -->
            <property name="cache.use_second_level_cache">true</property>
            <!-- 设置二级缓存供应商 -->
            <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
            
            <!-- 开启查询缓存 -->
            <property name="cache.use_query_cache">true</property>
            
            <!-- 开启线程绑定Session -->
            <property name="current_session_context_class">thread</property>
            <!--资源文件注册-->
            <mapping resource="cn/itcast/h3/query/hql/vo/StudentModel.hbm.xml"/>
            <mapping resource="cn/itcast/h3/query/hql/vo/TeacherModel.hbm.xml"/>
            
            <!-- 二级缓存的配置(使用) -->
            <!-- 类级缓存的配置 -->
            <class-cache
                region="c1"
                usage="read-write"
                class="cn.itcast.h3.query.hql.vo.TeacherModel"
                />
            <class-cache
                region="c1"
                usage="read-write"
                class="cn.itcast.h3.query.hql.vo.StudentModel"
                />
            <!-- 集合缓存的配置 -->
            <collection-cache
                region="c1"
                usage="read-write"
                collection="cn.itcast.h3.query.hql.vo.TeacherModel.students"
                />
            
        </session-factory>
    </hibernate-configuration>
  • 相关阅读:
    A标签几种状况下的样式问题
    接口Comparator和Comparable的区别和联系
    Hash算法的讲解
    我所理解的面向对象
    MySQL中select * for update锁表的范围
    Java中使用同步关键字synchronized需要注意的问题
    大数据量下高并发同步的讲解(不看,保证你后悔)
    Apache、Tomcat、JBoss、Weblogic四个常用的JavaEE服务器
    ibatis基本内容简介
    Java常见排序算法之归并排序
  • 原文地址:https://www.cnblogs.com/xyhero/p/9352019.html
Copyright © 2011-2022 走看看