<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優化方案 ## HQL優化 1.使用參數綁定 1.使用綁定參數的原因是讓數據庫一次解析SQL,對后續的重復請求可以使用用生成好的執行計劃,這樣做節省CPU時間和內存。 2.避免SQL注入 2.盡量少使用NOT 如果where子句中包含not關鍵字,那么執行時該字段的索引失效。 3.盡量使用where來替換having Having在檢索出所有記錄后才對結果集進行過濾,這個處理需要一定的開銷,而where子句限制記錄的數目,能減少這方面的開銷 4.減少對表的查詢 在含有子查詢的HQL中,盡量減少對表的查詢,降低開銷 5.使用表的別名 當在HQL語句中連接多個表時,使用別名,提高程序閱讀性,并把別名前綴與每個列上,這樣一來,可以減少解析時間并減少列歧義引起的語法錯誤。 6.實體的更新與刪除 在hibernate3以后支持hql的update與delete操作 ![](https://box.kancloud.cn/2ccdd52768678700659d5b4799c502b1_622x149.png) ### 一級緩存優化 一級緩存也叫做session緩存,在一個hibernate session有效,這級緩存的可干預性不強,大多于hibernate自動管理,但它提供清除緩存的方法,這在大批量增加(更新)操作是有效果的,例如,同時增加十萬條記錄,按常規進行,很可能會出現異常,這時可能需要手動清除一級緩存,session.evict以及session.clear. ## 檢索策略(抓取策略) ### 延遲加載 延遲加載 是hibernate為提高程序執行的效率而提供的一種機制,即只有真正使用該對象的數據時才會創建。 load方法采用的策略延遲加載. get方法采用的策略立即加載。 檢索策略分為兩種: 1. 1. 類級別檢索 2. 2. 關聯級別檢索 ### 類級別檢索 類級別檢索是通過session直接檢索某一類對應的數據,例如 Customer c=session.load(Customer.class,1) Session.createQuery(“from Order”) 類級別檢索策略分為立即檢索與延遲檢索,默認是延遲檢索,類級別的檢索策略可以通過<class>元素的lazy屬性來設置 ,默認值是true 在hbm配置文件中設置 ![](https://box.kancloud.cn/cec421db919307765a6ed2a60badb07b_769x365.png) ### 關聯級別檢索 查詢到某個對象,獲得其關聯的對象或屬性,這種稱為關聯級別檢索,例如 c.getOrders().size() c.getName() 對于關聯級別檢索我們就要研究其檢索策略(抓取策略) ### 抓取策略介紹 指的是查找到某個對象后,通過這個對象去查詢關聯對象的信息時的一種策略。 一對一 `<one-to-one>` 一對多(多對一) `<set>`下有`<one-to-many> <many-to-one>` 多對多` <set>`下有`<many-to- many>` 我們主要是在`<set>`與`<many-to-one>`或`<one-to-one>`上設置fetch lazy 例如:查詢一個客戶,要關聯查詢它的訂單 客戶是一的一方,在客戶中有set集合來描述其訂單,在配置中我們是使用 ~~~ <set> <one-to-many> </set>.. ~~~ 可以在set標簽上設置兩個屬性 fetch lazy Fetch主要描述的是SQL語句的格式(例如是多條,子查詢,多表聯查 Lazy 控制SQL語句何時發送 例如:在查詢一個訂單時,要查詢客戶信息 `<many-to-one> 或<one-to-one>` 也可以設置fetch lazy Fetch主要描述的是SQL語句的格式(例如是多條,子查詢,多表聯查 Lazy 控制SQL語句何時發送 總結: 講解抓取策略 在兩方面設置 ~~~ <set fetch="" lazy=""> <many-to-one fetch="" lazy=""> <one-to-one> ~~~ ### 注解配置抓取策略 問題:如何使用注解來設置 在`<setse>`設置的fetch與lazy可以使用下面注解來描述 ![](https://box.kancloud.cn/b8f44c2f72d6d99c9ae1321da072d372_784x399.png) ## set上的fetch與lazy set上的fetch與lazy它主要是用于設置關聯的集合信息的抓取策略。 Fetch可取值有: 1. SELECT 多條簡單的sql (默認值) 2. JOIN 采用迫切左外連接 3. SUBSELECT 將生成子查詢的SQL lazy可取值有: 1. TURE 延遲檢索 (默認值) 2. FALSE 立即檢索 3. EXTRA 加強延遲檢索(及其懶惰) ![](https://box.kancloud.cn/413eef459a416dd2230b127ff5677f12_669x446.png) ### 第一種組合 ![](https://box.kancloud.cn/741b5add6353648510577a5315bfe4da_649x129.png) ### 第二種組合 ![](https://box.kancloud.cn/02463fefb17cf7d818a8ced374054728_694x146.png) ### 第三種組合 ![](https://box.kancloud.cn/b68481f990b125995e633dd2b798e834_656x104.png) 當查詢客戶信息時,不會查詢訂單信息,當需要訂單的個數時,也不會查詢訂單信息, 只會通過count來統計訂單個數。 當我們使用size(),contains()或isEmpty()方法時不會查詢訂單信息。 ### 第四種組合 如果fetch選擇的是join方案,那么lazy它會失效。 生成SQl將采用的是迫切左外連接(left outer join fetch) 會立即查詢。 ![](https://box.kancloud.cn/0e851f39fea9105511537111b142494a_646x91.png) ### 第5種組合 ![](https://box.kancloud.cn/2702dedd58e40fa26471c600e60915e9_647x96.png) 會生成子查詢,但是我們在查詢訂單時采用的是延遲加載。 ### 第6種組合 ![](https://box.kancloud.cn/0896c30ad66ce082d012bd5b2b173ef7_659x90.png) 會生成子查詢,在查詢客戶信息時,就會將訂單信息也查詢出來 ### 第七種組合 ![](https://box.kancloud.cn/02b9c631f96036f4ca942f21ebe7fe42_648x95.png) 在查詢訂單時,只會根據情況來確定是否要訂單信息,如果不需要,例如我們 程序中size操作,那么就會發出`select count(*) from Order where c_customer_id=?` ### 結論 ![](https://box.kancloud.cn/0ca1929b06516a751566df0363b21239_481x226.png) ![](https://box.kancloud.cn/6f78ac5511273b246ebc0004f2d6dacd_570x50.png) no-session問題解決? 擴大session作用范圍 ![](https://box.kancloud.cn/a92f261ac8ca1ff40a40581ed5251e2a_568x335.png) ## One的一言fetch與lazy `<set fetch lazy>`它主要是設置在獲取到一的一方時,如果去查詢多的一方。 在`<many-to-one>或<one-to-one>`如果去查詢對方。 對于程序 就是在多的一方如何查詢一的主方信息 例如:獲取到一個訂單對象,要查詢客戶信息。 Fetch可取值: select 默認值,代表發送一條或多條簡單的select語句 join 發送一條迫切左外連接 lazy可取值 false 不采用延遲加載 proxy 默認值 是否采用延遲,需要另一方的類級別延遲策略來決定 no-proxy 不用研究 ![](https://box.kancloud.cn/1d42ed4829d0dc7876d79f87904c1872_667x399.png) ### 第一種組合 ![](https://box.kancloud.cn/6a3134439a29f0bfa4da3c6344a442f0_439x195.png) 當我們執行時,會首先發送一條sql只查詢訂單信息,客戶信息會延遲,只有真正需要客戶信息時,才會發送sql來查詢客戶信息. ### 第二種組合 ![](https://box.kancloud.cn/bd82d518110cc4eebff60ff46e6677b1_802x287.png) ### 第三種組合 ![](https://box.kancloud.cn/88ea439f4eecbe86fd4f1396610d5598_566x137.png) ### 第四種組合 ![](https://box.kancloud.cn/54c5ed43015293adb72eec86639a81ae_470x167.png) ## 批量抓取 我們在查詢多個對象的關聯對象時,可以采用批量抓取方式來對程序進行優化. 要想實現批量抓取: 可以在配置文件中 batch-size屬性來設置 可以使用注解 @BatchSize(size=4) 可以采用批量抓取來解決N+1問題. 抓取客戶的時候一次抓取幾個聯系人 查詢客戶,查詢訂單 ![](https://box.kancloud.cn/a0284718ef3f03a323261d94be5ff644_734x473.png) 查詢訂單,查詢客戶 ![](https://box.kancloud.cn/314c268f0d00612124b88eac92ab5428_769x578.png) ![](https://box.kancloud.cn/387acc86cd87c7a2a99a5d238e4d2944_815x370.png)
                  <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>

                              哎呀哎呀视频在线观看