hibernate12--缓存
<!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(); }
}
hibernate12--缓存的更多相关文章
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- ASP.NET Core 中间件之压缩、缓存
前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- [Java 缓存] Java Cache之 DCache的简单应用.
前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...
- [原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- 深究标准IO的缓存
前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...
- 缓存工厂之Redis缓存
这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...
- .net 分布式架构之分布式缓存中间件
开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群, ...
随机推荐
- 使用mkbootfs制作ramdisk根文件系统
span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...
- 集合总结--ArrayList、LinkedList、HashMap
一.概述 ArrayList:数组集合. 查询.修改.新增(尾部新增)快,删除.新增(队列中间)慢,适用于查询.修改较多的场景. LinkedList:双向链表集合.查 ...
- 图解 Git
https://juejin.im/entry/5917c463da2f60005de84195
- ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\10.m3u8
ffmpeg -i 10.wmv -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 C:\fm\074\10\1 ...
- Android MediaPlayer播放项目res/raw和res/assets下的音频文件
1..播放res/raw //方法一:根据音频文件的ID来创建MediaPlayer MediaPlayer mp = new MediaPlayer(this,R.raw.test); mp.sta ...
- Effective Java 第三版—— 84. 不要依赖线程调度器
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 批量替换存储过程内容脚本sp_SqlReplace
开始 在数据库开发过程中,如果某一个表字段名被重命名.那么在使用到该字段的存储过程,对应的表字段名也要修改. 当存在多个存储都有使用该表字段,需要逐个去修改替换,是一件比较繁琐的事情,我们需要一个能实 ...
- 时间序列异常检测算法S-H-ESD
1. 基于统计的异常检测 Grubbs' Test Grubbs' Test为一种假设检验的方法,常被用来检验服从正太分布的单变量数据集(univariate data set)\(Y\) 中的单个异 ...
- 很烦人的maven和gradle的jar缓存
1. 起因 a. 最近在学习大数据相关东西,自然就少不免去操作linux系统,更别说不敲命令 b. 然而那个配置软件时,很经常使用ln -s为一个软件目录(带着版本或者其他信息的长命名)创建别名(软连 ...
- Protobuf3 编解码
我们已经基本能够使用Protocol Buffers生成代码,编码,解析,输出及读入序列化数据.该篇主要讲述PB message的底层二进制格式.不了解该部分内容,并不影响我们在项目中使用Protoc ...