1. 程式人生 > >Hibernate之查詢效率問題

Hibernate之查詢效率問題

相信越來越多的web開發者,在持久層都採用了hibernate。都說hibernate效率高,可是當整個專案下來後發現,比
其他持久層版本慢很多,當然功能也多很多。記得當初同事測試hibernate銷率時,在100萬資料量的情況下,hibernate的效率
幾乎接近於jdbc,那麼為什麼如今很多公司的專案執行那麼慢呢(不僅僅是hibernate),也許有些細節上的東西我們開發人員沒有注意。

  就拿hibernate來說吧,他支援hql查詢,在我們組裝sql語句時,需要注意2個問題:
  1、要查詢當然離不開資料庫,我們建表時,預設的主鍵都是索引,這裡要注意的就是關於
     建立單個索引和複合索引了。
     介紹下:單個索引就是出現索引欄位作為條件就應用 ;
             複合索引(假設是2個欄位的複合索引),出現複合索引的第一個欄位作為條件就應用;
             出現複合索引的2個欄位作為條件,這應用,如果沒有出現複合索引的第一個欄位則不應用;
     由此我們需要為我們的資料庫建立索引,記住複合索引是有順序的 。
     
     影響我們建立索引的條件還有就是業務(這個很重要),舉個例子:如果有2個查詢條件(性別、所在部門),倘若我們要建立符合索引,
     那麼我們應該將"所在部門"欄位放在前面,"性別"放在後面,主要是因為,如果某個地方的查詢條件只有"所在部門",也可以起作用。另外要注意,如果查詢索引欄位參與函式計算和like等,那麼索引也不起作用。


  2、在我們寫查詢程式碼時,儘量對應各個表的已經存在索引寫查詢條件,
     [第一個查詢條件儘量是單個索引,或者是複合索引的第一個欄位] 。
 3、還有就是大家再拼裝查詢語句時,傳入的查詢條件值儘量不要直接寫在查詢語句中,而是要以引數的方式提供,
    這樣,系統多次呼叫統一個查詢時(比如:select * from employee wherecode = ?  [不要寫為  select * from employee wherecode = 'aaaa']) ,
    條件值都是以引數的方式提供的,這樣,多次查詢雖然引數值不一樣,但查詢語句相同,資料庫只有第一次才對查詢語句進行編譯,
    以後則不在編譯,所以效能會有提升。
    用引數的方式還有一個好處是:如果你不是使用
    Criteria criteria = openSession().createCriteria(**PO.class);
    criteria.add(Restrictions.like( "name",convertDBString(name)));
    的方式,而是使用hibernate的hql的話,那麼如果引數值為中文會有問題,用引數可以解決這個問題。

相關推薦

Hibernate查詢效率問題

相信越來越多的web開發者,在持久層都採用了hibernate。都說hibernate效率高,可是當整個專案下來後發現,比 其他持久層版本慢很多,當然功能也多很多。記得當初同事測試hibernate銷率時,在100萬資

QBC資料查詢 ——hibernate查詢語句

敘:之前介紹過hibernate的HQL(hibernate query language)的查詢資料方式,現在我學習記錄一下關於hibernate的另一個查詢資料的方式–QBC,QBC資料查詢全稱是(Query By Criteria資料查詢),下面是我學習的筆記~ QBC資

Hibernate查詢結果排序

一,查詢結果排序 HQL和QBC都支援查詢結果排序。 HQL採用ORDER BY關鍵字排序; QBC採用Order類進行排序。 (1)HQL採用ORDER BY關鍵字進行排序 在資料庫中,預設order by關鍵字為升序排序,與order by name asc一樣,而or

HibernateHQL多表查詢

多表的查詢進行使用HQL語句進行查詢,HQL語句和SQL語句的查詢語法比較類似 內連線查詢 顯示內連線 select * from customer c inner join orders o on c.cid = o.cno

Hibernate框架查詢方式QBC查詢

QBC(Query By Criteria)檢索方式 簡單查詢,使用的是Criteria介面 List<Customer> list = session.createCriteria(Customer.class).list(); for(Customer custo

hibernatehql查詢語言

HQL(Hibernate Query Language) 是面向物件的查詢語言, 它和 SQL 查詢語言有些相似. 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式.。它有如下功能: 在查詢語句中設定各種查詢條件; 支援投影查詢, 即僅

Hibernate條件查詢HQL和QBC

一、HQL查詢 HQL(Hibernate Query Language)是一種面向物件的查詢語言,依賴於Query類,每個Query例項對應一個查詢物件。查詢步驟如下: 1)獲取Hibernate Session物件 2)編寫HQL語句 3)以HQL語句作為引數,呼叫sessi

Hibernate*hbm.xml檔案和實體類操作資料庫實現插入和查詢

一、實體類(Entity) package com.javademo; import java.util.Date; public class Event { private Long id; private String title;

Hibernate快取體系查詢快取(query cache),以及list和iterate方法的區別

       Hibernate框架提供了Session.load()和Session.get()方法,用來根據實體物件的主鍵值從資料庫中查詢對應記錄。針對load和get方法,hibernate提供了一級快取和二級快取的支援,提高查詢效率,具體可以參考我的部落格:通過測試

SSH框架學習Hibernate day04查詢操作API

1、物件導航查詢,很普通 (1) 根據ID查詢某個客戶,再查詢這個客戶裡面的所有聯絡人 Customer customer = session.get(Customer.class,1); Set<LinkMan> linkman = custome

hibernate,高階查詢指定欄位查詢,並返回對應實體

String alias = “user_”; //查詢時的table別名 DetachedCriteria dc = DetachedCriteria.forClass(User.class,ali

hibernate檢索小結——查詢優化和延遲載入

Hibernate抓取(檢索方式) 檢索分為:立即檢索和延遲檢索 區別和原理:立即檢索當(使用者)請求一發立刻向資料庫傳送sql語句,不管該物件有沒有被使用(訪問去屬性)。而延遲檢索則是類似於保留查詢,只有在該物件唄使用的時候才會想資料庫傳送sql語句,其實延遲檢索返回的是

Hibernate框架查詢快取

一級快取跟二級快取都只能快取實體物件, 而查詢快取可以快取基本屬性, 同時查詢快取也可以快取實體物件, 但是隻能快取其id 查詢快取的生命週期是: 一旦資料庫表的資料發生修改, 則查詢快取則被清掉了 直接使用Hibernate框架提供的查詢快取即可 第一步: 開啟查詢快

Hibernate Criteria查詢多表連線分頁-1

最近嘗試用Hibernate的Criteria查詢實現多表連線下的分頁,發現一些Hibernate的奇怪問題:多表連線後的分頁求總條數始終報錯,檢查生成的sql也不正確。研究許久找到問題所在,特貼如下: Mysql指令碼如下: 學生 測試資料,請勿見笑:) /* Navic

Hibernate查詢效率

本文主要測試兩種Hibernte檢索的效率:1. 只訪問一次資料庫,將所有需要的物件檢索出來,然後資料庫外部做業務邏輯處理2. 利用HQL的函式做業務邏輯處理,但需要多次訪問資料庫。測試1程式碼:private static final String HQL1 =

Hibernate三態篇

結果 定義 tro 緩存 session nsa weight sys -c 一、概況 (一)瞬時狀態(暫時態) 在對象中假設對象剛被創建但沒有被持久化的話就是瞬時態 特點: (1) 不和 Session 實例關聯 (2)

hibernate多對一單向關聯

als exce 方法 試用 size code 產生 配置文件 sse 一個工作組(Group)裏能夠有多個用戶(User),一個User僅僅屬於一個Group,這是典型的多對一的關系。在多對一的關系中正確的數據庫設計是在多的這方(在這裏是User這方

hibernate查詢緩存和二級緩存的配合使用

介紹 條件 效果 發現 代碼 spa family 又一 希望 我的上一篇博客Hibernate緩存體系之查詢緩存(query cache),以及list和iterate方法的差別介紹了查詢緩存的概念,以及list和iterate的差別。讀者可能註意到:那篇博客測試的前

hibernate4.延遲載入

pop not in 異常 .get pos pan 實體對象 content except 延遲載入: 僅僅有當使用以實體對象的屬性(除主鍵屬性外)時,才會發送查詢語句到數據庫 get不支持延遲載入 @Test public void getTes

php 查詢 投票練習0508

sheng rms svm rem ins jieba ngx nor au3 %E4%BD%BF%E7%94%A8LIBSVM%E5%B7%A5%E5%85%B7%E5%AE%9E%E7%8E%B0%E6%A0%B7%E6%9C%AC%E5%88%86%E7%B1%BB%