本文為博主原創,允許轉載,但請聲明原文地址:http://www.coselding.cn/blog/8/8-141.html (1)大量分頁查詢時,及時session.clear(),可能導致內存溢出; 大集合遍歷:如尋找敏感詞匯; 注:內存泄漏,Java本身不會內存泄漏,但是Java調用的底層C會內存泄
本文為博主原創,允許轉載,但請聲明原文地址:http://www.coselding.cn/blog/8/8-141.html
(1)大量分頁查詢時,及時session.clear(),可能導致內存溢出;
大集合遍歷:如尋找敏感詞匯;
注:內存泄漏,Java本身不會內存泄漏,但是Java調用的底層C會內存泄漏。
(2)1+N問題:(典型面試題)
一個實體A關聯著另一個實體B,查詢所有的實體A時,原本一條sql語句就可完成,結果后面卻多了N條查詢各個A關聯的實體B的查詢語句的問題,影響性能。
解決辦法:A. 實體B設置為LAZY;
B.BatchSize多次單條查詢合并成少次的多條查詢,減少sql次數;
C.join fetch:設置外連接,把后面要查詢的也一起查出來,減少查詢次數。
(3)BatchSize多次單條查詢合并成少次的多條查詢,減少sql次數。
(4)List的Iterator:
A.List:Query查詢到的List是直接一條sql查詢所有結果;
B.Iterator:只查詢表的最小主鍵,接下來每訪問一條才發送一條sql語句查詢具體的記錄,但是Iterator使用了Hibernate的緩存,同一個session查詢兩次,底層sql只發送一次而已,它會自己去緩存中查詢結果是否已經有了,減少sql查詢次數。
(5)一級緩存、二級緩存、查詢緩存(面試題)
A.一級緩存:session中的緩存,查詢過一次之后的同一個session下再次查詢會從緩存中查詢;
B.二級緩存:SessionFactory級別的緩存,可以跨越session,Hibernate沒有實現,需要使用第三方二級緩存實現,默認EHCache,需要EHCache和Logging的jar;
a.打開二級緩存:Hibernate主配置文件設置打開緩存并指定二級緩存實現類;
@Cache注解:標注需要緩存到二級緩存的實體Entity;
Ehcache.xml:EHCache二級緩存的配置文件,可設置多個緩存配置,根據
name選擇設置的屬性配置;
b.適用二級緩存:經常訪問、改動不大、數量有限;
c.load、iterator默認使用二級緩存,list有往二級緩存加數據但是查詢時不使用;
d.query若要使用二級緩存,需要打開查詢緩存,
setCachable(true);指明Query打開二級緩存;
e.緩存算法:LRU最近最少使用、FIFO(先進先出)、LFU(最近最不常使用)
C.查詢緩存:特殊的二級緩存,專門用于查詢操作;
(6)二級緩存使用步驟:
A.導入ehcache的jar和commons-logging的jar;
B.類路徑加入ehcache的配置文件,里面配置緩存配置;
C.hibernate的全局配置文件配置開啟二級緩存;
D.
E.
(7)事務并發處理(面試):
事務基礎知識見JDBC筆記;
A. 悲觀鎖:解決不可重復讀,load添加第三個參數設置;
悲觀地認為別人總想著影響自己,直接加鎖,防止別人的影響;
B. 樂觀鎖:解決多人同時修改,程序中實現;
樂觀地認為別人不會來影響自己,加一個記錄版本號的屬性,@Version,事務開始時檢查版本號,到真正要修改時再檢查版本號,若版本號不變,則正確執行,版本號變了說明被影響了,報錯;
(8)一定要設置連接池!!!
(9)一定注意數據庫的全表查詢是禁止的,關聯關系的多方直接不延遲也是禁止的,Hibernate會把整個表加入內存和一級緩存,很容易導致內存溢出。
本文為博主原創,允許轉載,但請聲明原文地址:http://www.coselding.cn/blog/8/8-141.html
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com