1. Hibernate一級緩存sql
Hibernate的一級緩存就是指session緩存。數據庫
actionQueue它是一個行列隊列,它主要記錄crud操做的相關信息緩存
persistenceContext它是持久化上下文,它實際上是真正緩存。session
在session中定義了一系列的集合來存儲數據,它們構成session緩存。ide
只要session沒有關閉,它就會一直存在。測試
當咱們經過hibernate中的session提供的一些API例如 save get update等進行操做時,就會將持久化對象保存到session中,當下一次在去查詢緩存中具備的對象(OID值來判斷),spa
就不會去從數據庫查詢,而是直接從緩存中獲取。hibernate
Hibernate的一級緩存存在的目的就是爲了減小對數據庫訪問。3d
在hibernate中還有一個二級緩存,它是SessionFactory級別緩存。code
1.1.一級緩存的存在
經過第八行斷點,進行查看
1.2. 持久化對象具備自動更新數據庫能力(快照更新)
// 測試一級緩存 @Test public void test3() { // 1.獲得session Session session = HibernateUtils.openSession(); session.beginTransaction(); Customer c = session.get(Customer.class, 1); // 查詢id=1的customer對象,若是查詢到,會將c存儲到一級緩存中。 Customer cc = session.get(Customer.class, 1); // 會從一級緩存 // 中查詢,而不會向數據庫在發送sql // 2.事務提供,關閉 session.getTransaction().commit(); session.close(); }
// 持久化對象具備自動更新數據庫能力 @Test public void test4() { // 1.獲得session Session session = HibernateUtils.openSession(); session.beginTransaction(); Customer c = session.get(Customer.class, 1); // 查詢id=1的customer對象,若是查詢到,會將c存儲到一級緩存中。 c.setName("tom"); // 操做持久化對象來修改屬性 // 2.事務提供,關閉 session.getTransaction().commit(); session.close(); }
爲何持久化對象具備自動更新數據庫能力?
1.3. 一級緩存經常使用API
一級緩存特色:
當咱們經過session的save,update saveOrupdate進行操做時,若是一級緩存中沒有對象,會將這些對象從數據庫中查詢到,存儲到一級緩存。
當咱們經過session的load,get,Query的list等方法進行操做時,會先判斷一級緩存中是否存在,若是沒有才會從數據庫獲取,而且將查詢的數據存儲到一級緩存中。
當調用session的close方法時,session緩存清空。
clea()r 清空一級緩存.
evict(object) 清空一級緩存中指定的一個對象。
refresh()從新查詢數據庫,用數據庫中信息來更新一級緩存與快照
close();關閉session時也會清空一級緩存
1.4. Hibernate經常使用API-Session補充
update
udpate操做它主要是針對於脫管對象,持久對象具備自動更新能力。
問題1:若是咱們直接操做的對象是一個脫管對象,執行update會出現什麼狀況?
Update操做時,若是對象是一個脫管對象,能夠操做,
它會將脫管對象轉換成持久對象在操做
若是在session中出現相同的oid兩個對象,會產生異常
問題2脫管對象的oid若是在數據表中不存在,會報異常?
因此:在操做中,建議咱們經過持久化對象來直接修改其操做。
// 測試一級緩存操做經常使用API @Test public void test5() { // 1.獲得session Session session = HibernateUtils.openSession(); session.beginTransaction(); // 操做 List<Customer> list = session.createQuery("from Customer").list(); // 會存儲數據到一級緩存 session.clear(); // 清空一級緩存 Customer c = session.get(Customer.class, 1); // 會先從session一級緩存 // 中獲取,若是不存在,纔會從數據庫獲取 session.evict(c); // 從一級緩存 中刪除一個指定的對象 Customer cc = session.get(Customer.class, 1); cc.setName("kkkk"); session.refresh(cc); // 從新查詢數據庫,用數據庫中信息來更新一級緩存與快照 // 2.事務提供,關閉 session.getTransaction().commit(); session.close(); } // session的update操做 @Test public void test6() { // 1.獲得session Session session = HibernateUtils.openSession(); session.beginTransaction(); //獲得id=1的 Customer對象 //Customer cc=session.get(Customer.class, 1); //session一級緩存中存在了一個oid爲1的Customer // 執行update來操做一個脫管對象 Customer c = new Customer(); c.setAddress("廣州"); c.setName("趙六"); c.setId(11); session.update(c); //當執行update時會將c放入到session一級緩存 // 2.事務提供,關閉 session.getTransaction().commit(); session.close(); }
saveOrUpdate
若是對象是一個瞬時對象 --------執行save操做
若是對象是一個脫管對象---------執行update
若是是一個持久對象-------直接返回
delete
刪除一個脫管對象,與session關聯,在刪除
注意:若是執行delete操做,先刪除一級緩存,在刪除數據庫中的數據。
// session的update操做 @Test public void test6() { // 1.獲得session Session session = HibernateUtils.openSession(); session.beginTransaction(); //獲得id=1的 Customer對象 //Customer cc=session.get(Customer.class, 1); //session一級緩存中存在了一個oid爲1的Customer // 執行update來操做一個脫管對象 Customer c = new Customer(); c.setAddress("廣州"); c.setName("趙六"); c.setId(11); session.update(c); //當執行update時會將c放入到session一級緩存 // 2.事務提供,關閉 session.getTransaction().commit(); session.close(); }
saveOrUpdate
若是對象是一個瞬時對象 --------執行save操做
若是對象是一個脫管對象---------執行update
若是是一個持久對象-------直接返回
delete
刪除一個脫管對象,與session關聯,在刪除
注意:若是執行delete操做,先刪除一級緩存,在刪除數據庫中的數據。