在處理大數據量時,會有大量的數據緩衝保存在 Session 的一級緩存中,這緩存大太時會嚴重顯示性能,因此在使用 Hibernate 處理大數據量的,可使用 session.clear() 或者 session. Evict(Object) 在處理過程當中,清除所有的緩存或者清除某個對象。 2) 對大數據量查詢時,慎用 list() 或者 iterator() 返回查詢結果, 1. 使用 List() 返回結果時, Hibernate 會全部查詢結果初始化爲持久化對象,結果集較大時,會佔用不少的處理時間。 2. 而使用 iterator() 返回結果時,在每次調用 iterator.next() 返回對象並使用對象時, Hibernate 才調用查詢將對應的對象初始化,對於大數據量時,每調用一次查詢都會花費較多的時間。當結果集較大,可是含有較大量相同的數據,或者結果集不是所有都會使 用時,使用 iterator() 纔有優點。 3. 對於大數據量,使用 qry.scroll() 能夠獲得較好的處理速度以及性能。並且直接對結果集向前向後滾動。 3) 對於關聯操做, Hibernate 雖然能夠表達複雜的數據關係,但請慎用,使數據關係較爲簡單時會獲得較好的效率,特別是較深層次的關聯時,性能會不好。 4) 對含有關聯的 PO (持久化對象)時,若 default-cascade="all" 或者 「save-update」 ,新增 PO 時,請注意對 PO 中的集合的賦值操做,由於有可能使得多執行一次 update 操做。 5) 在一對多、多對一的關係中,使用延遲加載機制,會使很多的對象在使用時 才 會初始化,這樣可以使得節省內存空間以及減小數據庫的負荷,並且若 PO 中的集合沒有被使用時,就可減小互數據庫的交互從而減小處理時間。 6) 對於大數據量新增、修改、刪除操做或者是對大數據量的查詢,與數據庫的交互次數是決定處理時間的最重要因素,減小交互的次數是提高效率的最好途徑,因此在 開發過程當中,請將 show_sql 設置爲 true ,深刻了解 Hibernate 的處理過程,嘗試不一樣的方式,可使得效率提高。 7) Hibernate 是以 JDBC 爲基礎,可是 Hibernate 是對 JDBC 的優化,其中使用 Hibernate 的緩衝機制會使性能提高,如使用二級緩存以及查詢緩存,若命中率較高明,性能會是到大幅提高。 8) Hibernate 能夠經過設置 hibernate.jdbc.fetch_size , hibernate.jdbc.batch_size 等屬性,對 Hibernate 進行優化。 9) 不過值得注意的是,一些數據庫提供的主鍵生成機制在效率上未必最佳,大量併發 insert 數據時可能會引發表之間的互鎖。數據庫提供的主鍵生成機制,每每是經過在一個內部表中保存當前主鍵狀態(如對於自增型主鍵而言,此內部表中就維護着當前的 最大值和遞增量),以後每次插入數據會讀取這個最大值,而後加上遞增量做爲新記錄的主鍵,以後再把這個新的最大值更新回內部表中,這樣,一次 Insert 操做可能致使數據庫內部屢次表讀寫操做,同時伴隨的還有數據的加鎖解鎖操做,這對性能產生了較大影響。 所以,對於併發 Insert 要求較高的系統,推薦採用 uuid.hex 做爲主鍵生成機制。 10) Dynamic Update 若是選定,則生成 Update SQL 時不包含未發生變更的字段屬性,這樣能夠在必定程度上提高 SQL 執行效能 . Dynamic Insert 若是選定,則生成 Insert SQL 時不包含未發生變更的字段屬性,這樣能夠在必定程度上提高 SQL 執行效能 11) 在編寫代碼的時候請,對將 POJO 的 getter/setter 方法設定爲 public ,若是設定爲 private , Hibernate 將沒法對屬性的存取進行優化,只能轉而採用傳統的反射機制進行操做,這將致使大量的性能開銷(特別是在 1.4 以前的 Sun JDK 版本以及 IBM JDK 中,反射所帶來的系統開銷至關可觀)。 12) 在 one-to-many 關係中,將 many 一方設爲主動方( inverse=false )將有助性能的改善 13) 因爲多對多關聯的性能不佳(因爲引入了中間表,一次讀取操做須要反覆數次查詢),所以在設計中應該避免大量使用 . 14) Hibernate 支持兩種鎖機制:即一般所說的「悲觀鎖( Pessimistic Locking )」和「樂觀鎖( Optimistic Locking )」。 悲觀鎖帶來 數據庫性能的大量開銷,特別是對長事務而言,這樣的開銷每每沒法承受。樂觀鎖機制在必定程度上解決了這個問題.樂觀鎖機制避免了長事務中的數據庫加鎖開 銷,大大提高了大併發量下的系統總體性能表現。