<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 簡介 **Hibernate的一級緩存就是指session緩存, 默認打開** ~~~ private transient ActionQueue actionQueue; private transient StatefulPersistenceContext persistenceContext; ~~~ actionQueue它是一個行列隊列,它主要記錄crud操作的相關信息 persistenceContext它是持久化上下文,它其實是真正緩存。 在session中定義了一系列的集合來存儲數據,它們構成session緩存。 只要session沒有關閉,它就會一直存在。 當我們通過hibernate中的session提供的一些API例如 `save get update`等進行操作時,就會將持久化對象保存到session中,當下一次在去查詢緩存中具有的對象(OID值來判斷), 就不會去從數據庫查詢,而是直接從緩存中獲取。 **Hibernate的一級緩存存在的目的就是為了減少對數據庫訪問。** **在hibernate中還有一個二級緩存, 使用范圍是整個項目的,它是SessionFactory級別緩存。** # 一級緩存 ## 簡介 Session緩存是一塊內存空間,用來存放相互管理的java對象, 在使用 Hibernate查詢對象的時候,首先會使用對象屬性的OID值在Hibernate的一級緩存中進行査找,如果找到匹配OID值的對象,就直接將該對象從一級緩存中取出使用,不會再查詢數據庫; 如果沒有找到相同OID值的對象,則會去數據庫中査找相應數據。 當從數據庫中査詢到所需數據時,該數據信息也會放置到一級緩存中。 Hibernate的一級緩存的作用就是減少對數據庫的訪問次數。 在 Session接口的實現中包含一系列的Java集合,這些Java集合構成了 Session緩存。 只要session實例沒有結束生命周期,存放在它緩存中的對象也不會結束生命周期。固一級緩存也被稱為是 ession基本的緩存。 **Hibernate的一級緩存有如下特點:** 當應用程序調用 Session接口的 `save()、 update()、 saveOrUpdate`時,如果 Session緩存中沒 有相應的對象, Hibernate就會自動的把從數據庫中查詢到的相應對象信息加入到一級緩存 中去。 當調用 Session接口的 load()、get()方法,以及 Query接口的 list()、 iterator()方法時,會判 斷緩存中是否存在該對象,有則返回,不會査詢數據庫,如果緩存中沒有要查詢對象,再去數據庫中查詢對應對象,并添加到一級緩存中。 當調用 Session的 close()方法時, Session緩存會被清空。 **演示一級緩存的存在** ~~~ //查詢id=1的customer對象,如果查詢到,會將c存儲到一級緩存中 Customer c = session.get(Customer.class, 1); //會從一級緩沖中查詢,而不會從數據庫查 Customer c2 = session.get(Customer.class, 1); ~~~ **持久化對象具有自動更新數據庫的能力** ~~~ //查詢id=1的customer對象,如果查詢到,會將c存儲到一級緩存中 Customer c = session.get(Customer.class, 1); //操作持久化對象來修改屬性 c.setName("tom"); ~~~ **為什么持久化對象具有自動更新數據庫的能力?** Hibernate向一級緩存放入數據時,同時復制一份數據放入到 Hibernate快照中, **當使用commit方法提交事務時,同時會清理 Session的一級緩存,** 這時會使用OID判斷一級緩存中的對象和快照中的對象是否一致,如果兩個對象中的屬性發生變化,則執行 update語句,將緩存的內容同步到數據庫,并更新快照; 如果一致,則不執行 update語句。 Hibernate快照的作用就是確保一級緩存中的數據和數據庫中的數據一致 ![](https://img.kancloud.cn/13/a3/13a3c148955eeba01753dee03be7448c_1113x507.png) ## 一級緩存常用API 一級緩存特點: 1. 當我們通過session的save,update saveOrupdate進行操作時,如果一級緩存中沒有對象,會將這些對象從數據庫中查詢到,存儲到一級緩存。 2. 當我們通過session的load,get,Query的list等方法進行操作時,會先判斷一級緩存中是否存在,如果沒有才會從數據庫獲取,并且將查詢的數據存儲到一級緩存中。 3. 當調用session的close方法時,session緩存清空。 clear: 清空一級緩存. evict: 清空一級緩存中指定的一個對象。 **refresh: 重新查詢數據庫,用數據庫中信息來更新一級緩存與快照** ~~~ 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("kkk"); session.refresh(cc); //重新查詢數據庫,用數據庫中信息來更新一級緩存與快照 ~~~ 一級緩存也叫做session緩存,在一個hibernate session有效,這級緩存的可干預性不強,大多于hibernate自動管理, 但它提供清除緩存的方法,這在大批量增加(更新)操作是有效果的,例 如,同時增加十萬條記錄,按常規進行,很可能會出現異常,這時可能需要手動清除一級緩存,session.evict以及session.clear. # Hibernate常用API-Session補充 ## update udpate操作它主要是針對于脫管對象,持久對象具有自動更新能力。 問題1:如果我們直接操作的對象是一個脫管對象,執行update會出現什么情況? Update操作時,如果對象是一個脫管對象,可以操作,它會將脫管對象轉換成持久對象在操作 如果在session中出現相同的oid兩個對象,會產生異常 ~~~ org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already ~~~ 問題2: 脫管對象的oid如果在數據表中不存在,會報異常? ~~~ org. hibernate. StaleStateException: Batch update returned unexpected row count from update [o]: actual row at org. hibernate jdbc Expectations$Basi cExpectation checkBatched (Expectations. java 67) ~~~ 所以:在操作中,建議我們通過持久化對象來直接修改其操作。 ## saveOrUpdate 如果對象是一個瞬時對象 --------執行save操作 如果對象是一個脫管對象---------執行update 如果是一個持久對象-------直接返回 ## delete 刪除一個脫管對象,與session關聯,在刪除 注意:如果執行delete操作,先刪除一級緩存,在刪除數據庫中的數據
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看