博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
27hibernate_cache_level_1
阅读量:6613 次
发布时间:2019-06-24

本文共 6424 字,大约阅读时间需要 21 分钟。

hibernate一级缓存
    
一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务级缓存
那些方法支持一级缓存:
    * 
get()
    * load()
    * iterate(查询实体对象)
    
如何管理一级缓存:
    * session.clear(),session.evict()
    
如何避免一次性大量的实体数据入库导致内存溢出
    * 先flush,再clear
    
如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求可以考虑采用数据本身的特定导入工具    
什么时候用一级缓存?
不是经常改变的,相对静止的    
eternal=
"
false
"不是    永恒的    
expires有效期
ExportDB:
create table t_classes (id integer not 
null auto_increment, name varchar(
255), primary key (id))
create table t_student (id integer not 
null auto_increment, name varchar(
255), classesid integer, primary key (id))
alter table t_student add index FK4B9075708EBC77F7 (classesid), add constraint FK4B9075708EBC77F7 foreign key (classesid) references t_classes (id)
    
    
mysql> create database hibernate_cache;
Query OK, 
1 row affected (
0.11 sec)
mysql> use hibernate_cache;
Database changed
InitData:
Hibernate: insert into t_classes (name) values (?)
Hibernate: insert into t_student (name, classesid) values (?, ?)
package com.bjsxt.hibernate;
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();
            
//
不会发出sql,因为load支持lazy,
            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();
            
//
马上会发出sql,因为get不支持lazy,
            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();
            
//
会发出N——1条查询sql(此处为二条)
            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);
        }
        
//
第二个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是使用缓存的(在数据库中有相应的记录,与一级缓存session有关,纳入它的管理)
            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);
        }
    }    
    
    
/*
*
     * 在同一个session中依次load  clear load
     
*/
    
public 
void testCache8() {
        Session session = 
null;
        
try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            
//
不会马上发出sql,因为load支持lazy,
            Student student = (Student)session.load(Student.
class
1);
            System.
out.println(
"
student.name=
" + student.getName());
            
            
//
我们可以用clear或者evict管理一级缓存
            session.clear();
//
清除缓存中的数据
            
//
会发出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);
        }
    }        
    
}

转载地址:http://eaaso.baihongyu.com/

你可能感兴趣的文章
C#日期格式化
查看>>
被企业微信吓到了吗?离做到极致还早
查看>>
机器学习如何威胁企业安全
查看>>
以测试用例为核心的软件测试
查看>>
浙江湖州出台光伏补贴新政 5年建设10万户家庭屋顶光伏
查看>>
五种机房动力环境监控系统的优缺点
查看>>
大数据企业要发展不能仅仅靠秀“肌肉”
查看>>
聊聊Oracle外键约束的几个操作选项
查看>>
人脸支付有漏洞?支付宝:不是所有用户都能用
查看>>
《请君入瓮——APT攻防指南之兵不厌诈》—第8章8.节工具及战术
查看>>
21 世纪的孩子们请注意!编程已成必备技能
查看>>
《AutoCAD 2016中文版从入门到精通》——1.3 图形的缩放和平移
查看>>
MapReduce多个job同时使用的方式(从网上找到的案例,原始博文:http://www.cnblogs.com/yjmyzz/p/4540469.html)...
查看>>
《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.4节在Photoshop中还原操作...
查看>>
Tracking.js —— 实现网页上的人脸识别
查看>>
15 个 Android 通用流行框架大全
查看>>
《嵌入式 Linux应用程序开发标准教程(第2版)》——2.2 Linux启动过程详解
查看>>
《深入理解Android:卷III A》一一3.2音量管理
查看>>
test
查看>>
java基础知识: day7-正则表达式
查看>>