java對象中的三種狀態和臟檢查及刷新緩存機制


瞬時狀態

  瞬時狀態又稱臨時狀態.如果java對象與數據庫中的數據沒有任何的關聯,即此java對象在數據庫中沒有相關聯的記錄,此時java對象的狀態為瞬時狀態,session對於

瞬時狀態的ava對象是一無所知的,當對象不再被其他對象引用時,它的所有數據也就丟失了,對象將會被java虛擬機按照垃圾回收處理

持久狀態

  當對象與session關聯,被session管理時,它就處於持久狀態.處於直接狀態的對象擁有數據庫標識符(數據庫中主鍵的值).那么,對象是什么時候與session發生關聯呢?

  1. 通過session查詢接口,或者get()方法,或者load()方法從數據庫中加載對象的時候,加載的對象是與數據庫表中的一條記錄關聯的,此時對象與加載它的session發生關聯,
  2. 對瞬時狀態的對象調用session的save(),saveOrUpdate()等方法時,在保存對象數據的同事,java對象的內部狀態發生了任何變更,hibernate會選擇合適的時間(如事務提交時)將變成同步到數據庫中

游離狀態

  游離狀態又稱托管狀態,處於持久狀態的對象,脫離與其關聯的session的管理后,對象就處於游離狀態.處於游離狀態的對象,hibernate無法保證對象所包含的數與數據

庫中的記錄一致,因為hibernate以及無法感知對該對象的任何操作.session提供了update(),saveOrupdate()等方法,將處於游離狀態的對象數以更新的方式同步到數據庫中

,並將該對象與當前的session關聯.這時,對的狀態就從游離狀態重新轉換為持久狀態

三種狀態之間的轉換

  1. 瞬時轉持久

    1. 使用session的save(),saveOrUpdate()等方法保存對象后,該對象的狀態由誰是狀態轉換為持久狀態
    2. 使用session的get()或load()方法獲取對象,該對象的狀態是持久狀態
  2. 持久轉瞬時

    1. 執行session的delete()方法后,對象由原來的持久狀態變為瞬時,因為此時該對象沒有與任何數據庫關聯
  3. 持久轉游離

    1. 執行session的evict(),clear()或close()方法,對象由原來的持久狀態轉為游離
  4. 游離轉持久

    1. 執行session的update()或saveOrUpdate()方法,對象由游離轉為持久,該對象再次與當前session相關聯
  5. 游離轉瞬時

     1.執行session的delete方法,對象由游離轉為瞬時

注意:處於瞬時或游離的對象不再被其他對象引用時,會被JVM按照垃圾回收機制處理

臟檢查

  在hibernate中,數據前后發生變化的對象,稱為臟對象.

tx= HibernateUtil.currentSession().beginTransaction();
//獲取員工對象,此時對象處於持久狀態
Emp empUpdate = empDao.update(7900);
//修改后,信息和之前不同,此時 empUpdate對象成為"臟對象"
empUpdate.setSal(6666);
//提交事務
tx.commit();

  以上代碼中empUpdate對象處於持久狀態,當對象被加入session緩存中時,session會為對象復制一份快照,如果快照的屬性發生改變即成為臟對象.

在事務提交時,hibernate會對session中持久化的對象進行檢查,即比較對象當前屬性與它的快照,以判斷屬性是否發生變化,這種判斷成為臟檢查.

發生改變session會使用最新的屬性值來執行相關的SQL語句,將變化保存確保數據庫和對象數據的數據一致

刷新緩存機制

   當session緩存中對象的屬性發生變化時,session並不會立即執行臟檢查和相關的SQL語句,而是在特定的時間,即刷新緩存時才執行.使得session

能夠把多次變化合並為一條或者一批SQL語句,減少訪問次數提高程序的數據訪問性能.

  在默認情況下,session會在以下時間點刷新緩存

  1. 應用程序顯示調用session的flush()方法
    1. session的flush()方法進行刷新緩存的操作,會觸發臟檢查,從而執行相關的SQL語句
  2. 應用程序調用事務的 commit()方法時
    1. commit()方法會先調用session的刷新緩存的方法flush(),然后向數據庫提交事務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM