`
spring-china
  • 浏览: 50797 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

复习 - 持久化环境相关的其他API (clear, evict, setReadyOnly)和FlushMode

阅读更多

复习 - 持久化环境相关的其他API (clear, evict, setReadyOnly)和FlushMode

 

前面的一些复习提到了Hiberante的自动脏数据检查功能,他的实质是会保存对象的一个快照,这个功能固然很好很强大,但是一旦数据量比较大,那么快照所需的空间也会比较大,所以我们可能需要在合适的时候进行手动的清理,来确保不会OutOfMemory

 

有下面几种可以清理的session中的对象或是阻止生成快照的方法

 

1. evict

这个方法就是将session中的对象(persist状态)清理出去,让他变成detached状态. 这样在session级别的缓存中就不会有该对象存在,如果查询同一条数据库中的数据,会重新生成查询语句加载,例子如下:

 

package com.yxy.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.yxy.bean.Student;

public class HibernateClearTest {
	
	public static void main(String[] args){
		
		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
		Session session = sessionFactory.openSession();
		session.getTransaction().begin();
		
		Student s1 = (Student)session.get(Student.class, 1);
		
		session.evict(s1);		
		
		Student s2 = (Student)session.get(Student.class, 1);
		
		session.getTransaction().commit();
		session.close();
	}
}

 

 可以在控制台看到加载s2,虽然对应的是数据库中的同一条记录,但是重新生成了select语句,说明一级缓存中的对象已经被清理出去了.

 

Hibernate: 
    /* load com.yxy.bean.Student */ select
        student0_.id as id0_0_,
        student0_.name as name0_0_,
        student0_.sex as sex0_0_,
        student0_.register_date as register4_0_0_ 
    from
        student student0_ 
    where
        student0_.id=?
Hibernate: 
    /* load com.yxy.bean.Student */ select
        student0_.id as id0_0_,
        student0_.name as name0_0_,
        student0_.sex as sex0_0_,
        student0_.register_date as register4_0_0_ 
    from
        student student0_ 
    where
        student0_.id=?
 

 

2. clear

clear针对的是session中的所有对象. 原理同evict一样,同样的是让所有persist状态的对象全部变成detached状态,移出persistent context环境. 这样就不会对该对象生成快照,从而避免了脏数据检查. 节省了空间, 例子:

 

package com.yxy.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.yxy.bean.Student;

public class HibernateClearTest {
	
	public static void main(String[] args){
		
		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
		Session session = sessionFactory.openSession();
		session.getTransaction().begin();
		
		Student s1 = (Student)session.get(Student.class, 1);
		
		session.clear();
		
		s1.setName("update detached object");
		
		session.getTransaction().commit();
		session.close();
	}
}

 

 从控制台可以看到没有生成update sql,仅有一条加载的sql, 而且数据库中的数据也没有被更新,这是因为s1已经是detached状态,当事务提交时并不会对detached状态的对象进行检查,所以更新不会同步到数据库中.

 

Hibernate: 
    /* load com.yxy.bean.Student */ select
        student0_.id as id0_0_,
        student0_.name as name0_0_,
        student0_.sex as sex0_0_,
        student0_.register_date as register4_0_0_ 
    from
        student student0_ 
    where
        student0_.id=?
 

 

3. setReadOnly

顾名思义,setReadOnly会将对象设置成只读的,所以hiberante不会因为对该对象做了update就对其进行脏数据检查从而同步到数据库,Hiberante不会对设置成readonly的对象做脏数据检查,但是设置成只读的对象并没有在session中被清除掉,不像clear和evict那样.  

例子:

 

package com.yxy.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.yxy.bean.Student;

public class HibernateClearTest {
	
	public static void main(String[] args){
		
		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
		Session session = sessionFactory.openSession();
		session.getTransaction().begin();
		
		Student s1 = (Student)session.get(Student.class, 1);
		
		/*
		 * set to read only
		 */
		session.setReadOnly(s1, true);
		
		/*
		 * s1 will not be removed from session cache, so when call this statement, no need load again.
		 */
		Student s2 = (Student)session.get(Student.class, 1);
		
		/*
		 * because s1 is read only, so will not flush this update to db when the transaction is commit
		 */
		s1.setName("update detached object");
		
		session.getTransaction().commit();
		session.close();
	}
}

 

 可以看到生成的log不会重复加载,也不会生成update sql

 

Hibernate: 
    /* load com.yxy.bean.Student */ select
        student0_.id as id0_0_,
        student0_.name as name0_0_,
        student0_.sex as sex0_0_,
        student0_.register_date as register4_0_0_ 
    from
        student student0_ 
    where
        student0_.id=?
 

 

另外,就是要记住Hibernate的几种FlushMode

1. FlushMode.AUTO

特点: 是Hibernate的默认行为, 当事务被提交或者是发生查询时,会flush脏数据到db

 

2. FlushMode.COMMIT

特点: 只有在事务被提交或调用session.flush()才会flush脏数据到db


3. FlushMode.MANUAL

特点: 只有在调用session.flush()时才会flush脏数据到db.

分享到:
评论
3 楼 21jhf 2011-03-28  
<div class="quote_title">spring-china 写道</div>
<div class="quote_div">
<div class="quote_title">21jhf 写道</div>
<div class="quote_div">楼住,FlushMode在那里设置的?默认值是什么?</div>
<p><br><br>是在Java代码里面设置的,像这样</p>
<p> </p>
<pre name="code" class="java">session.setFlushMode(FlushMode.COMMIT)</pre>
 默认的级别是FlushMode.AUTO, 也就是事务被提交或者发生查询之后才会将脏数据同步到db里面.
 
<p> </p>
<p> </p>
</div>
<p>谢谢</p>
2 楼 spring-china 2011-03-28  
<div class="quote_title">21jhf 写道</div>
<div class="quote_div">楼住,FlushMode在那里设置的?默认值是什么?</div>
<p><br><br>是在Java代码里面设置的,像这样</p>
<p>
</p>
<pre name="code" class="java">session.setFlushMode(FlushMode.COMMIT)</pre>
 默认的级别是FlushMode.AUTO, 也就是事务被提交或者发生查询之后才会将脏数据同步到db里面.
 
<p> </p>
<p> </p>
1 楼 21jhf 2011-03-28  
楼住,FlushMode在那里设置的?默认值是什么?

相关推荐

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    - **detached(游离)**:对象曾经是持久化的,但已从Session中移除,比如在调用`detach`或`clear`后。游离状态的对象可以通过`merge`或`update`方法重新与Session关联,以同步其状态。 了解这些概念和方法的区别...

    java-hibernate持久化

    "java-hibernate持久化"这个主题主要关注如何使用Hibernate来管理对象的生命周期和状态,以及其内部的一级缓存机制。 首先,我们讨论Hibernate中的持久化对象状态。这些状态定义了对象与Hibernate Session的关系,...

    深入理解持久化对象

    持久化对象根据与Session的关系可以分为三种状态:瞬态、持久化和托管。 - **瞬态(Transient)**:对象刚被创建出来,还没有与任何Session建立关联,此时的对象不在Session的管理之下。 - **持久化(Persistent...

    hibernate中evict()和clear()的区别.docx

    `evict()`和`clear()`方法都是用于管理Session缓存中的对象,但它们的作用和使用场景有所不同。理解这些概念对于优化Hibernate应用程序和避免潜在问题至关重要。 首先,`session.evict(obj)`方法是用来从缓存中移除...

    关于flush和evict

    在持久层框架Hibernate中,`flush()`和`evict()`方法是开发者在处理数据时经常会遇到的两个重要概念。它们对于理解Hibernate的工作机制及其缓存管理至关重要。本文将通过一系列具体的示例来探讨这两个方法的作用与...

    java持久化.pdf

    Java持久化是编程领域中一个重要的概念,主要指的是将Java对象的数据存储到持久化存储介质,如数据库中,以便在程序运行的不同阶段都能访问这些数据。在Java中,Hibernate是一个常用的对象关系映射(ORM)框架,它为...

    hibernate核心API

    ### Hibernate核心API详解:持久化生命周期 #### 一、引言 Hibernate作为一款优秀的对象关系映射(Object Relational Mapping,简称ORM)框架,能够帮助开发者以面向对象的方式处理数据库中的数据,极大地简化了...

    Hibernate对象持久化状态

    在 Hibernate 框架中,Java 对象的状态管理和 Session 缓存是核心概念,它们直接影响着数据的持久化过程和数据库交互效率。本篇文章将详细阐述 Hibernate 中对象的三种状态——临时状态、持久化状态和游离状态,以及...

    Hibernate API

    Hibernate API 是一个强大的Java持久化框架,用于简化数据库操作,它是ORM(对象关系映射)解决方案的一部分,使得开发者可以通过对象模型来操作数据库,而无需直接编写SQL语句。以下是Hibernate API的一些关键方法...

    Hibernate对象

    - 游离状态的对象原来是持久化对象,但因为`Session`被关闭、清空(`Clear`)或显式地`evict`,导致对象不再受Hibernate的管理。尽管它们仍持有持久化标识符,但由于与`Session`的断开,它们不再与数据库实时同步。 ...

    hibernate api

    Hibernate API 是一个强大的Java持久化框架,用于简化数据库操作,它是ORM(对象关系映射)的一种实现。在Java开发中,Hibernate提供了一种抽象层,允许开发者使用面向对象的方式来处理数据库,而无需直接编写SQL...

    hibernate帮助手册api大集合

    这个“Hibernate帮助手册API大集合”应该涵盖了这些核心概念的详细解释,以及相关的API示例和用法指导,对于学习和精通Hibernate非常有帮助。在实际开发中,开发者可以结合这个资源,高效地完成数据持久化的工作。

    SSHnote session函数的对象状态转换

    在Hibernate中,对象有三种基本状态:瞬时(Transient)、持久化(Persistent)和脱管(Detached)。理解这些状态及其之间的转换对于有效地使用Hibernate进行数据操作至关重要。 1. **瞬时状态(Transient)**: ...

    三大框架[收集].pdf

    可通过Session.close()或Session.evict()使对象从持久化状态变为游离状态。 **状态转换** - 临时状态-&gt;持久化状态:通过Session.save()、Session.load()、Session.get()或Session.find()。 - 持久化状态-&gt;游离状态...

    深入学习Hibernate持久化对象的三个状态

    当`Session`关闭或调用了`Session`的`close()`、`clear()`或`evict()`方法时,原本处于持久化状态的对象就会变为离线状态。离线对象仍然持有数据库的主键ID,但不再受Hibernate管理。它们可以被修改,如果需要将...

    jsp Hibernate 函数简介.docx

    - **对象状态**:持久化对象有三种状态:自由状态(transient)、持久化状态(persistent)和游离状态(detached)。 - **自由状态**:对象未与Session关联,数据库中无对应记录。 - **持久化状态**:对象与...

    如何解决hibernate自动更新实体类的问题共5页.pd

    1. **Hibernate的持久化状态**:Hibernate将实体分为瞬时(Transient)、持久化(Persistent)和游离(Detached)三种状态。当你从数据库加载一个实体后,它处于持久化状态,任何对它的修改都会被跟踪。 2. **自动...

    Hibernate3.1API.rar

    而clear()和evict()方法则用于清理会话中的对象。 五、查询语言HQL Hibernate Query Language(HQL)是面向对象的查询语言,类似于SQL,但操作的是对象而不是表。HQL支持更复杂的查询,如关联查询、分组、排序等。...

    Hibernate总结

    Hibernate是一款强大的Java持久化框架,用于简化数据库操作。它提供了对象关系映射(ORM)功能,使得开发者可以使用面向对象的方式来处理数据库事务。以下是对Hibernate中一些核心概念和操作的总结: **一、映射一...

    Hibernate中的实体状态及转换

    **持久化状态(Persistent) -&gt; 游离状态(Detached)**:关闭Session,或者调用`evict()`, `clear()`方法,使得对象离开Session的管理范围,进入游离状态。即使对象原本是持久化的,也会因为失去了Session的管理而变为...

Global site tag (gtag.js) - Google Analytics