文档章节

Hibernate一级缓存

CanyellWang
 CanyellWang
发布于 2015/09/20 21:07
字数 783
阅读 4
收藏 0

import java.io.Serializable;

 

import org.hibernate.Session;

 

import junit.framework.TestCase;

 

public class CacheLevel1Test extends TestCase {

 

/**

* 在同一个session中发出两次load查询

*/

public void testCache1() {

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

Student student = (Student)session.load(Student.class, 1);

System.out.println("student.name=" + student.getName());

//不会发出sql,因为load使用缓存

student = (Student)session.load(Student.class, 1);

System.out.println("student.name=" + student.getName());

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

 

/**

* 在同一个session中发出两次get查询

*/

public void testCache2() {

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

Student student = (Student)session.get(Student.class, 1);

System.out.println("student.name=" + student.getName());

//不会发出sql,因为get使用缓存

student = (Student)session.get(Student.class, 1);

System.out.println("student.name=" + student.getName());

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 在同一个session中发出两次iterate查询实体对象

*/

public void testCache3() {

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();

System.out.println("student.name=" + student.getName());

//会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存

student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();

System.out.println("student.name=" + student.getName());

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 在同一个session中发出两次iterate查询实体对象

*/

public void testCache4() {

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

//查询属性而不是实体,故不会在一级缓存中写入数据

String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();

System.out.println("student.name=" + name);

//iterate查询普通属性,一级缓存不会缓存,所以发出sql

//一级缓存是缓存实体对象的

name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();

System.out.println("student.name=" + name);

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 开启两个session中发出load查询

*/

public void testCache5() {

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

Student student = (Student)session.load(Student.class, 1);

System.out.println("student.name=" + student.getName());

 

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

try {

session = HibernateUtils.getSession();

session.beginTransaction();

//会发出查询语句,session间不能共享一级缓存的数据

//因为它会伴随session的生命周期存在和消亡

Student student = (Student)session.load(Student.class, 1);

System.out.println("student.name=" + student.getName());

 

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

/**

* 在同一个session中先save,在发出load查询save过的数据

*/

public void testCache6() {

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

Student stu = new Student();

stu.setName("王五");

Serializable id = session.save(stu);

//不会发出sql,因为save是使用缓存的

Student student = (Student)session.load(Student.class, id);

System.out.println("student.name=" + student.getName());

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

 

/**

* 向数据库中批量加入1000条数据

*/

public void testCache7() {

Session session = null;

try {

session = HibernateUtils.getSession();

session.beginTransaction();

for (int i=0; i<1000; i++) {

Student student = new Student();

student.setName("s_" + i);

session.save(student);

//每20条数据就强制session将数据持久化

//同时清除缓存,避免大量数据造成内存溢出

if ( i % 20 == 0) {

session.flush();

session.clear();

}

}

session.getTransaction().commit();

}catch(Exception e) {

e.printStackTrace();

session.getTransaction().rollback();

}finally {

HibernateUtils.closeSession(session);

}

}

}

hibernate一级缓存
一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务级缓存
那些方法支持一级缓存:
* get()
* load()
* iterate(查询实体对象)
如何管理一级缓存:
* session.clear(),session.evict()
如何避免一次性大量的实体数据入库导致内存溢出
* 先flush,再clear
如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求可以考虑采用数据本身的特定导入工具

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/linshutao/article/details/5500609

上一篇: 连接查询
下一篇: HQL入门学习
CanyellWang
粉丝 13
博文 155
码字总数 27522
作品 0
海淀
程序员
私信 提问
Hibernate查询缓存全面分析

这里介绍Hibernate查询缓存对Iterator不起作用,只对List起作用。下面我们这种介绍把二级缓存 和 Hibernate查询缓存 结合使用。 AD: 本文向大家介绍Hibernate查询缓存,可能好多人还不了解H...

dong.li
2012/04/24
319
0
Hibernate一级缓存测试分析

Hibernate 一级缓存测试分析 Hibernate的一级缓存就是指Session缓存,此Session非http的session会话技术,可以理解为JDBC的Connection,连接会话,Session缓存就是一块内存空间,用来存放相互...

白超华
2018/08/15
0
0
Hibernater学习笔记(三)

1.Hibernate缓存 Hibernate一级缓存 hibernate 的一级缓存默认是打开的 hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围 hibernate的一级缓存中,储存数据必须...

Mr_欢先生
2017/12/08
0
0
Hibernate的一级缓存见解

Hibernate一级缓存: Hibernate中的一级缓存的理解,一共进行了三次查询。 第一次因为缓存中没有数据所以会去查询数据库,会发出sql语句; 第二次因为在同一个session中,所以可以使用hiber...

qjf_Troy
2013/12/06
155
0
day30_Hibernate学习笔记_02

一、Hibernate中对象的状态 对象状态   瞬时态|临时态:Transient     1、没有与Hibernate产生关联(没有与Session有关联)。     2、与数据库中的记录没有产生关联,即对象没有ID(...

黑泽明军
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
43
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部