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>

hibernate框架学习之二级缓存(测试用例)的更多相关文章

  1. hibernate框架学习之二级缓存

    缓存的意义 l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取.缓存是介于应用程序与永久性存储介质之间的一块数据存储区域.利用缓存,应用程序可以将使用的数 ...

  2. hibernate框架学习之一级缓存

    l缓存是存储数据的临时空间,减少从数据库中查询数据的次数 lHibernate中提供有两种缓存机制 •一级缓存(Hibernate自身携带) •二级缓存(使用外部技术) lHibernate的一级缓存 ...

  3. Hibernate框架(四)缓存策略+lazy

    Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两 ...

  4. Hibernate的查询,二级缓存,连接池

    Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...

  5. Hibernate框架学习笔记

      Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...

  6. hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存

    QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...

  7. Hibernate学习之二级缓存

    © 版权声明:本文为博主原创文章,转载请注明出处 二级缓存 - 二级缓存又称“全局缓存”.“应用级缓存” - 二级缓存中的数据可适用范围是当前应用的所有会话 - 二级缓存是可插拔式缓存,默认是EHCa ...

  8. hibernate框架学习第三天:对象状态、一级缓存、快照等

    对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...

  9. [ SSH框架 ] Hibernate框架学习之二

    一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...

随机推荐

  1. springboot中通用mapper结合mybatis generator的使用

    通用mapper就是指的是  tk.mybatis  包下的.这个是通用mapper就是说自动生成的dao层需要继承这个框架提供的mapper类.而我们之前用的org.mybatis这个最开始是普通的 ...

  2. 端口与进程-----Window cmd命令

    ********************  windows 篇 ********************** cmd命令: services.msc    打开本地服务页面 一.查看windows系统 ...

  3. golang反射举例

    反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性. package main import ( "f ...

  4. YouCompleteMe/third_party/ycmd/third_party/cregex" does not appear to contain CMakeLists.txt.

    rm -rf YouCompleteMe/third_party/ycmd/third_party/cregex git submodule update --init --recursive  at ...

  5. LR与SVM的异同

    原文:http://blog.sina.com.cn/s/blog_818f5fde0102vvpy.html 在大大小小的面试过程中,多次被问及这个问题:“请说一下逻辑回归(LR)和支持向量机(SV ...

  6. tedu训练营day04

    1.猜拳:import randomlist = ['石头','剪刀','布']y = input('''(0) 石头(1) 剪刀(2) 布请出拳(0/1/2):******************* ...

  7. Android SVN上传项目

    方式一: 1 工具栏 VCS ——import into Version Control - Share Project (SubVersion)(注意不要用import into SubVersio ...

  8. Reshaper安装后vs快捷键不起作用

    做如上设置

  9. 【Linux】排序命令sort

    很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...

  10. linux 下shell脚本备份文件

    以下是shell自动备份用的: 主要功能: 1)将pathSrc目录中的文件拷贝到pathDst目录中去. 具体步骤:先查询源目录和目标目录中的文件,分别存在fileSrc和fileDst中. -&g ...