1. 程式人生 > >證明hibernate一級緩存的存在

證明hibernate一級緩存的存在

.class mit 對象 session 註釋 update語句 相同 檢查 提交

hibernate中,所謂的一級緩存是指,當用session的api如save、get操作數據時,session首先並不會直接操作數據庫,而會操作為seesion分配的緩存區間,比方說,session.get(Customer.class,1);會先從緩存中查找有沒有id為1的custmer對象,如果有就直接使用,如果沒有才會訪問數據庫,並且將從數據庫中拿到的對象放入一級緩存中,以備下次使用。這樣就減少了對數據庫的訪問次數,提高了性能。

public class HibernateDemo1 {
	public static void main(String[] args) {
	
		Configuration cfg = new Configuration().configure();
		SessionFactory sf = cfg.buildSessionFactory();
		Session session = sf.openSession();
		Transaction tx = session.beginTransaction();
		tx.begin();
		Customer customer = session.get(Customer.class, 1);
		//session.clear();
		Customer customer2 = session.get(Customer.class, 1);
		tx.commit();
		session.close();
		System.out.println(customer);
		System.out.println(customer2);
	}
}

上述代碼,雖然兩次使用了session.get方法,但是觀察控制臺發現sql只執行了一次,這就證明了session緩存的存在。

當打開註釋掉的session.clear()代碼時,sql又會執行兩次了。因為session.clear()的作用就是清空seesion的緩存。

此外,session.close()後,session的緩存也會隨之被清理了。

除了緩存能提高效率外,hibernate還有一個提高效率的機制,那就是快照,快照能減少不必要的update語句。

快照的原理是,當數據寫入session緩存的同時,也寫一份給快照,我們修改數據是修改的緩存的那一份,當最後需要提交到數據庫時,先檢查要提交的數據和快照的那一份是否相同,如果相同,就說明不需要對數據庫進行update,所以就不執行update語句。

證明hibernate一級緩存的存在