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. Java 微信公众号迁移

    背景:公众号换主体,要迁移,粉丝(openId)的业务数据要做处理. 第一步:参照我的另一篇文章,Java 导出微信公众号粉丝. 第二部:数据处理(master-worker模式) 程序主入口:Mai ...

  2. Redis 高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...

  3. Linux 检查 外部设备 是否存在

    以 USB 为例,如果移植了udev,那么在usb插入的时候,/dev下面会出现usb有关的设备,同时,自动挂载到文件系统的某个节点 如果以文件系统usb对应的挂载点来检测USB是否插入,是不够严谨的 ...

  4. 【英文文档】Solidifier for Windows Installation Guide

    Page 1Solidifier for Windows  Installation Guide Page 2McAfee, Inc.McAfee® Solidifier for Windows In ...

  5. bootstrap开发微票儿网站首页

    1.html代码 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...

  6. maven更新项目版本

    mvn versions:set -DnewVersion=1.0.1-SNAPSHOT // 此操作会生成pom备份文件,推荐使用 mvn versions:set -DnewVersion=1.1 ...

  7. 动态字段列表实现及List<T>排序

    public class StudentCardSortHelper<T> { //itemName 要排序的字段名 public static List<StudentCard&g ...

  8. LINQ to SQL 中 Concat、Union、Intersect、Except 方法的使用

    Ø  前言 LINQ to SQL 中需要对两个或多个数据集进行操作,比如:合并.取交集等,主要使用下面四个方法,这四个方法都是 System.Linq.IQueryable<out T> ...

  9. 浅谈style.,currentStyle,getComputedStyle,getAttribute

    xxx为属性. ele为元素. 1.style.是针对于样式 在前面的一篇博客中我也有说到,ele.style.xxx; 通常用于赋值,赋值也是针对于行内样式,用它来取值的话,它只能取到内联样式. 今 ...

  10. Windows打开文件

    cmd中, windows  打开文件命令:start: Linux       打开文件命令:open