<!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.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">t10</property>
<property name="connection.password">t10</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<!--方言 -->
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- 在我们的项目中使用currentSession-->
<property name="current_session_context_class">thread</property>
<!-- 开启配置2级缓存 -->
<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> <!--加载我们配置的映射文件 全路径 -->
<mapping resource="cn/bdqn/bean/Dept.hbm.xml" />
<mapping resource="cn/bdqn/bean/Emp.hbm.xml" /> </session-factory>
</hibernate-configuration>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.bdqn.bean">
<class name="Emp">
<!-- 配置2级缓存策略 -->
<cache usage="read-only"/> <id name="empNo">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="empName"/>
<property name="job"/>
<property name="sal" column="salary"/>
<property name="hireDate"/>
<!-- 配置多对一关联
name:对应的是 本类中 关联关系的属性名
column:对应数据库中 两个表的 外键!
class:关联的实体类
-->
<many-to-one name="dept" column="DEPTNO" class="Dept"/>
</class>
</hibernate-mapping>
<ehcache>

<!-- java.io.tmpdir:临时系统文件!  可以换成自己创建的目录下 -->
<diskStore path="java.io.tmpdir"/> <!--
maxElementsInMemory:在内存中 最大的存储量 10000对象
eternal:是否永远不销毁
timeToIdleSeconds:当前缓存的数据闲置多少时间被销毁 以秒为单位
timeToLiveSeconds:当前缓存的数据超过多少时间被销毁 以秒为单位
overflowToDisk: 是否写入磁盘
diskPersistent:硬盘文件是否永久保存
memoryStoreEvictionPolicy: 缓存清理策略: FIFO ,first in first out (先进先出). LFU , Less Frequently Used (最少使用).
意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。 LRU ,Least Recently Used(最近最少使用).
(ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,
而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
package cn.bdqn.test;

import java.util.ArrayList;
import java.util.List; import oracle.net.aso.s; import org.hibernate.CacheMode;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.sun.org.apache.xml.internal.security.encryption.Transforms; import cn.bdqn.bean.Dept;
import cn.bdqn.bean.Emp;
import cn.bdqn.util.HibernateUtil; public class EmpTest { /**
* 1级缓存: session中的缓存
* clear():清空session中所有的缓存对象
* evict():清除session中指定的对象
*/ @Test
public void test01(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp = (Emp) session.get(Emp.class, 1); // 产生1条sql
session.clear(); //清空缓存
emp = (Emp) session.get(Emp.class, 1); //产生1条sql
}
@Test
public void test02(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp = (Emp) session.load(Emp.class, 1);
session.clear(); //清空缓存
emp = (Emp) session.load(Emp.class, 1);
} @Test
public void test03(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp1 = (Emp) session.get(Emp.class, 1); //产生1条sql
Emp emp2 = (Emp) session.get(Emp.class, 2); //产生1条sql
session.evict(emp1); //清除指定的
} @Test
public void test04(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp=new Emp();
emp.setEmpNo(51);
emp.setEmpName("haha");
session.save(emp);
session.evict(emp); //清除指定的
transaction.commit(); // 能保存到数据库中吗? 肯定不能保存 除非把 session.evict(emp); 去掉
} @Test
public void test05(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp=new Emp();
emp.setEmpNo(52);
emp.setEmpName("haha");
session.save(emp); //持久态
System.out.println("********");
session.flush(); //产生sql语句 把 emp对象 同步到 数据库
System.out.println("********");
session.evict(emp); //清除指定的 但是 已经 清理了 缓存
transaction.commit(); // 能保存到数据库中,因为已经flush
} @Test
public void test06(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp=(Emp) session.get(Emp.class, 1); //持久化
emp.setEmpName("haha"); //emp 脏对象
System.out.println("flush前******************");
session.flush(); //同步数据库
System.out.println("flush后******************");
emp=(Emp) session.get(Emp.class, 1); //持久化
System.out.println(emp.getEmpName()); //输出 haha 证明同步到数据库中了
emp.setEmpName("heihei"); //emp 脏对象
transaction.commit();
} /**
* 2级缓存: 进程或者是集群范围内的缓存!是sessionFactory的缓存!
* 一个sessionFactory可以创建N个session!
* 也就是说 在2级缓存中的数据,N个session共享!
*
*
* 2级缓存适合存放的数据:
* 01.不经常被修改的数据
* 02.不敏感的数据 (财务数据不能放入)
* 03.共享的数据
*
*
* 配置ehCache缓存
* 01.引入jar
* 02.找到对应xml文件
* 03.在hibernate.cfg.xml文件中 开启和配置缓存
* 04.在对应的映射文件中 配置 缓存的策略
*/ @Test
public void test07(){ //之前是 两条sql语句
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp = (Emp) session.get(Emp.class, 1); // 产生1条sql
session.clear(); //清空缓存
emp = (Emp) session.get(Emp.class, 1);
} /**
* 验证我们 映射文件中的 <cache usage="read-only"/>
*/
@Test
public void test08(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp = (Emp) session.get(Emp.class, 1); // 产生1条sql
emp.setEmpName("hahaahaha");
session.update(emp);
transaction.commit(); //报错 can't writer to readonly object!!
} //java.io.tmpdir:临时系统文件! 可以换成自己创建的目录下
@Test
public void test09(){
System.out.println(System.getProperty("java.io.tmpdir"));
} /**
* 设置2级缓存 模式
* CacheMode.IGNORE: 不与2级缓存关联 产生2条sql
* CacheMode.NORMAL:与2级缓存关联,可读可写 产生1条sql
* CacheMode.GET:与2级缓存关联,只读 产生1条sql
* CacheMode.PUT:与2级缓存关联,只写 产生2条sql
* CacheMode.REFRESH:与2级缓存关联,只写
* 通过 hibernate.cache.use_minimal_puts 的设置,强制二级缓存从数据库中读取数据,刷新缓存内容。
* 产生2条sql
*/
@Test
public void test10(){
Session session = HibernateUtil.getCurrentSession();
Transaction transaction = session.beginTransaction();
Emp emp = (Emp) session.get(Emp.class, 1); // 产生1条sql
session.clear();
//设置缓存模式
session.setCacheMode(CacheMode.REFRESH);
emp = (Emp) session.get(Emp.class, 1); } /*
* 查询缓存
* 基于2级缓存!
* 第一次在网页中查询一个关键字 为 java的所有 页面 可能需要等待 2S
* 第2次在网页中查询一个关键字 为 java的所有 页面 必须 小于2S
*
* 01.去核心配置文件中配置
* <property name="cache.use_query_cache">true</property>
* 02.手动开启查询缓存
* query.setCacheable(true);
*/ @Test
public void test11(){
Session session = HibernateUtil.getCurrentSession();
Query query = session.createQuery("from Dept");
query.setCacheable(true); //首次开启 ! 之后如果还是这个query语句,那么就会启动查询缓存
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
System.out.println("****************************");
Query query2 = session.createQuery("from Dept");
query2.setCacheable(true); //先去 查询缓存中查找
List list2 = query2.list();
for (Object object : list2) {
System.out.println(object);
}
System.out.println("****************************");
Query query3 = session.createQuery("from Dept");
//query3.setCacheable(true);
List list3 = query3.list();
for (Object object : list3) {
System.out.println(object);
}
session.close(); } }

hibernate13--缓存的更多相关文章

  1. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  2. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  3. ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...

  4. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  5. [Java 缓存] Java Cache之 DCache的简单应用.

    前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...

  6. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  7. 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  8. 深究标准IO的缓存

    前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...

  9. 缓存工厂之Redis缓存

    这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...

  10. .net 分布式架构之分布式缓存中间件

    开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件  方便实现缓存的分布式,集群, ...

随机推荐

  1. django【自定义分页】

    1. views.py def app(request): page_info = PageInfo(request.GET.get('p'), 6, 100, request.path_info, ...

  2. go——方法

    方法是与对象实例绑定的特殊函数.方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例都有各自不同的独立特征,以属性和方法来暴露对外通信接口.普通函数则专注于算法流程,通过 ...

  3. git命令与协同开发

    一 git命令 1.简单命令 git init # 初始化 (建立git 版本相关文件关系都放这里) git config --global user.email "you@example. ...

  4. 搭建自己的npm仓库

    第一步:安装Erlang环境 首先,安装必要的库 yum install build-essential yum install libncurses5-dev yum install libssl- ...

  5. mapreduce编程--(准备篇)

    mapreduce编程准备 学习mapreduce编程之前需要做一些概念性的了解,这是做的一些课程学习笔记,以便以后时不时的翻出来学习下,之前看过一篇文章大神们都是时不时的翻出基础知识复习下,我也做点 ...

  6. jQuery获取URL的GET参数值

    // jQuery url get parameters function [获取URL的GET参数值] // <code> // var GET = $.urlGet(); //获取UR ...

  7. sq 如何创建全局的临时表。

    全局临时表的生命周期一直持续到创建会话(不是创建级别)才终止.例如,如果你在存储过程中创建全局临时表,当超出存储过程的范围时,该表并不会被销毁.当创建会话终止后,SQL Server才会自动尝试删除该 ...

  8. c语言URL通过Http下载mp3 格式

    通过http协议下载MP3的关键就是 整块打包,一块一块向文件里面存储.读取的时候用二进制 /***szWebAddr: 页面地址(包含host+addr) szMp3FileName:将要存储文件的 ...

  9. MPU6050工作原理及STM32控制MPU6050

    源:MPU6050工作原理及STM32控制MPU6050 MPU6050 介绍

  10. Apache 访问控制

    Apache访问控制 通过设置访问控制,可对网站进行权限管理,提高安全性. 参数介绍 <Directory />: 行为对根目录的限制 Options:允许使用控制目录特征的指令.他们包括 ...