<!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. shell脚本调用传参【转载】

    转自:https://www.cnblogs.com/cisum/p/8010658.html 1.直接使用$0,$1,$2,$3 $0是脚本的名字,就是按顺序来 #!/bin/bash # auth ...

  2. sga之library cache 内部原理

    一.概述 library cache(库缓存)是shared pool中的一块内存区域,它的主要作用是缓存刚刚执行过的sql语句和pl/sql(包括存储过程.包.函数.触发器)所对应的解析计划.解析树 ...

  3. Extracts

    @1:四层和七层负载均衡的区别:所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器.以常见的TCP为例,负载均衡设备在接收到第一个 ...

  4. WCF RIA SERVICE相关技术

    WCF RIA SERVICE实体属性拷贝 private void DoSubmit() { ((IEditableObject)this.RepairContract).EndEdit(); va ...

  5. redhat 9.0安装完不能上网解决办法(补) - 并附上redhat9.0 下载链接

    昨天一位网友Q我,说我的开发环境搭建教程按步骤最后上不了网怎么解决我才突然想起9.0版本在VM7,8中存在问题,于是今天我就简单说下解决的方法. 由于本人习惯使用redhat 9.0版本所以到现在还是 ...

  6. cdoj1337郭大侠与阴阳家

    地址:http://acm.uestc.edu.cn/#/problem/show/1337 思路: 郭大侠与阴阳家 Time Limit: 3000/4000MS (Java/Others)     ...

  7. maven项目,去除jar包中的不想要的依赖关系

    解释:就是说项目中要用到某一个a.jar包,通过maven引入了之后,也自动的导入了该jar包所依赖的包,这里就会存在一个问题,如果a.jar包依赖b.jar这个项目的1.0版本,可是我的项目中已经有 ...

  8. Hive2.2.1安装使用

    解压缩hive安装包tar zxvf apache-hive-2.1.1-bin.tar.gz 安装mysqlsudo yum install mysql-server 安装 mysql connec ...

  9. [原创] 毕设---在myeclipes中安装Hadoop开发插件

    1.安装Hadoop开发插件 hadoop安装包contrib/目录下有个插件hadoop-0.20.2-eclipse-plugin.jar,拷贝到myeclipse根目录下/dropins目录下. ...

  10. Django-JS实现的ajax

    JS实现的ajax ajax的优缺点 AJAX使用Javascript技术向服务器发送异步请求 AJAX无须刷新整个页面 因为服务器响应内容不再是整个页面,而是页面中的局部,所以AJAX性能高 小练习 ...