證明hibernate一級快取的存在
阿新 • • 發佈:2019-01-08
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語句。