hibernate一級緩衝,又稱為sesssion級緩衝
一級緩衝生命週期很短和session的生命週期一致,一級緩衝也叫session級的緩衝或事務級緩衝。主要用來緩衝實體物件的,而不會對實體物件的普通屬性進行緩衝
支援一級緩衝的方法:
* get()
* load()
* iterate(查詢實體物件)
管理一級緩衝的方法:
* session.clear(),session.evict()
如何避免一次性大量的實體資料入庫導致記憶體溢出
* 先flush,再clear
如果資料量特別大,考慮採用jdbc實現,如果jdbc也不能滿足要求可以考慮採用資料本身的特定匯入工具
測試案例(該測試案例基於一對多雙向關聯映射):
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();
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();
&