Hibernate 的一級快取

Kunaly發表於2018-02-06

Session 物件的一級快取

1. 什麼是快取?
* 其實就是一塊記憶體空間,將資料來源(資料庫或者檔案)中的資料存放到快取中.再次獲取的時候 ,直接從快取中獲取.可以提升程式的效能!


2. Hibernate框架提供了兩種快取
* 一級快取 -- 自帶的不可解除安裝的.一級快取的生命週期與session一致.一級快取稱為session級別的快取.
* 二級快取 -- 預設沒有開啟,需要手動配置才可以使用的.二級快取可以在多個session中共享資料,二級快取稱為是sessionFactory級別的快取.

package com.kunaly.test;

import java.io.Serializable;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.kunaly.domain.User;
import com.kunaly.utils.HibernateUtils;

/**
 * session 的一級快取的驗證
 * @author Administrator
 *
 */
public class Demo04 {
	
	/**
	 * 證明快取的存在
	 */
	@Test
	public void run1(){
		
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		
		// 建立物件
		User user = new User();
		user.setName("趙雲");
		user.setAge(18);
		
		// 儲存使用者,user一級存入到session的快取中
		Serializable id = session.save(user);
		System.out.println(id);
		
		//獲取物件,不會看到查詢的sql語句
		User user2 = session.get(User.class, id);
		System.out.println(user2.getName());
		System.out.println("觀察是否出現查詢的sql語句,未出現則代表從快取中取的");
		
		tr.commit();
		session.close();
		
	}
	
	/**
	 * 證明快取的存在
	 */
	
	@Test
	public void run2(){
		Session session = HibernateUtils.getSession();
		Transaction tr = session.beginTransaction();
		//最簡單的證明  查詢兩次 看sql語句出現的次數
		User user1 = session.get(User.class, 1);
		System.out.println(user1.getName());
		
		//清除user物件
		//session.evict(user1);
		//清空快取
		//session.clear();
		
		User user2 = session.get(User.class, 1);
		System.out.println(user2.getName());
		
		tr.commit();
		session.close();
		
	}
	
	

}


3. Session物件的快取概述
* Session介面中,有一系列的java的集合,這些java集合構成了Session級別的快取(一級快取).將物件存入到一級快取中,session沒有結束生命週期,那麼物件在session中存放著
* 記憶體中包含Session例項 --> Session的快取(一些集合) --> 集合中包含的是快取物件!


4. 證明一級快取的存在,編寫查詢的程式碼即可證明
* 在同一個Session物件中兩次查詢,可以證明使用了快取

如下:


5. Hibernate框架是如何做到資料發生變化時進行同步操作的呢?
* 使用get方法查詢User物件
* 然後設定User物件的一個屬性,注意:沒有做update操作。發現,資料庫中的記錄也改變了。
* 利用快照機制來完成的(SnapShot) 快照機制參照連線:點選開啟連結


控制 Session 的一級快取

1. 學習Session介面中與一級快取相關的方法
* Session.clear() -- 清空快取。
* Session.evict(Object entity) -- 從一級快取中清除指定的實體物件。
* Session.flush() -- 刷出快取

相關文章