A. hibernate的懶載入和二級緩存的問題
完全不同的兩個概念
hibernate二級緩存要藉助第三方程序來實現,延遲載入是hibernate在檢索屬性時候可以立即檢索或延遲檢索
B. 什麼是hibernate懶載入什麼時候用懶載入為什麼要用懶載入
所謂懶載入(lazy)就是延時載入,延遲載入。
什麼時候用懶載入呢,我只能回答要用懶載入的時候就用懶載入。
至於為什麼要用懶載入呢,就是當我們要訪問的數據量過大時,明顯用緩存不太合適,
因為內存容量有限 ,為了減少並發量,減少系統資源的消耗,
我們讓數據在需要的時候才進行載入,這時我們就用到了懶載入。
比如部門ENTITY和員工ENTITY,部門與員工1對多,如果lazy設置為false,那麼只要載入了一個部門的po,就會根據一對多配置的關系把所有員工的po也載入出來。但是實際上有時候只是需要用到部門的信息,不需要用到 員工的信息,這時員工po的載入就等於浪費資源。如果lazy設置為true,那麼只有當你訪問部門po的員工信息時候才回去載入員工的po的信息。
hibernate3.0中lazy有三個值,true,false,proxy,默認的是lazy="proxy".
具體設置成什麼要看你的需求,並不是說哪個設置就是最好的。
假如在student對象中包含一個head對象
如果你確定在用student對象的時候就要用到head對象里的屬性,那你就設置立即載入,因為設置立即載入那麼在查詢student的同時就會查詢student的head,hibernate就會在查詢的時候關聯兩張表從而生成的sql就可能只有一條。而如果你設置的是延遲載入,那麼肯定會要生成1+N條sql語句:其中「1」是查詢student的語句,「N」是根據N個student的id去查詢head的N條語句。而且,延遲載入是要用到的 時候才去執行查詢,這樣系統判斷那裡需要載入,那裡不需要載入也需要時間,性能上肯定就不如立即載入了!
如果,你是有的地方需要用到student的時候才用到head屬性,那麼你就設置成延遲載入,因為查詢2張表的數據肯定要比查詢1張表的數據消耗大。
到低要怎樣設置就要看你的實際需求了
延遲載入機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲載入就是當在真正需要數據的時候,才真正執行數據載入操作。在Hibernate中提供了對實體對象的延遲載入以及對集合的延遲載入,另外在Hibernate3中還提供了對屬性的延遲載入。
C. javascript圖片預載入和延時載入的區別
javascript圖片預載入和延時載入的區別主要體現在圖片傳輸到客戶端的時機上,都是為了提升用戶體驗的,延時載入又叫懶載入。
兩種技術的本質:兩者的行為是相反的,一個是提前載入,一個是遲緩甚至不載入。懶載入對伺服器前端有一定的緩解壓力作用,預載入則會增加伺服器前端壓力。
預載入:提前載入圖片,當用戶需要查看時可直接從本地緩存中渲染。
實現方式: 可以用CSS(background)、JS(Image)、HTML(<img />)都可以。常用的是new Image();設置其src來實現預載,再使用onload方法回調預載完成事件。只要瀏覽器把圖片下載到本地,同樣的src就會使用緩存,這是最基本也是最實用的預載方法。當Image下載完圖片頭後,會得到寬和高,因此可以在預載前得到圖片的大小(方法是用記時器輪循寬高變化)。
懶載入:主要目的是作為伺服器前端的優化,減少請求數或延遲請求數,一些圖片非常多的網站中非常有用,在瀏覽器可視區域外的圖片不會被載入,直到用戶將頁面滾動到它們所在的位置才載入,這樣對於含有很多 圖片的比較長的網頁來說,可以載入的更快,並且還能節省伺服器帶寬。,實現方式:
1.第一種是純粹的延遲載入,使用setTimeOut或setInterval進行載入延遲.
2.第二種是條件載入,符合某些條件,或觸發了某些事件才開始非同步下載。
3.jQuery插件中也有插件來實現該功能。
4.第三種是可視區載入,即僅載入用戶可以看到的區域,這個主要由監控滾動條來實現,一般會在距用戶看到某圖片前一定距離遍開始載入,這樣能保證用戶拉下時正好能看到圖片。
預載入核心代碼參考:
document.getElementById("preload-01").style.background = "url(http://expsoft.com/image-01.png) no-repeat -9999px -9999px";
img1 = new Image();img1.src = "http://expsoft.com/path/to/image-001.gif";
if (img1.complete) { ready.call(img); load && load.call(img);
callback.call(img1,img1.width, img1.height);
return; }// 直接返回,不用再處理onload事件
img1.onload = function(){ callback.call(img1,img1.width, img1.height); };
懶載入核心代碼參考:
.lazy {
display: none;
}
<img class="lazy" src="img/grey.gif" data-original="img/example.jpg" width="640" heigh="480">
必須在 DOM ready 時將佔位符顯示出來, 這可以在插件初始化的同時完成.
$("img.lazy").show().lazyload();
設置敏感度,默認情況下圖片會出現在屏幕時載入. 如果你想提前載入圖片, 可以設置 threshold 選項, 設置 threshold 為 200 令圖片在距離屏幕 200 像素時提前載入.
$("img.lazy").lazyload({ threshold : 200 });
D. hibernate一級緩存和二級緩存的區別
一級緩存為 session緩存,二級緩存是sessionfactory緩存。
E. hibernate中有沒有用過懶載入
所謂懶載入(lazy)就是延時載入,延遲載入。什麼時候用懶載入呢,我只能回答要用懶載入的時候就用懶載入。至於為什麼要用懶載入呢,就是當我們要訪問的數據量過大時,明顯用緩存不太合適,因為內存容量有限,為了減少並發量,減少系統資源的
F. 一對多,懶載入,能使用二級緩存嗎
二級緩存指的是SessionFactory,是全局性的,Session是一級緩存,有效期隨session開啟關閉而定,當樓主查詢一個記錄時會有一個oid被保存到一級緩存,當樓主再次查詢這個記錄時將會根據oid自動找到緩存中的數據,因此上述兩個查詢操作只查詢一次資料庫,只有一條sql產生。
G. hibernate 懶載入和一級緩存的關系。
3.Hibernate高級特性以及性能優化
1)延遲載入 : 當程序執行getter方法獲取時,才發送sql語句載入數據.
延遲載入給程序帶來好處,但是要避免session過早關閉問題
a. load()和get()兩個方法區別
load()採用延遲載入機制,返回的是一個proxy代理對象
get()沒有採用延遲載入,返回的是一個對象實例
b.Hibernate.initialize(user)
可以強制user對象實例化
c.hbm映射描述文件中,<class>,<property>,<set>等元素
都可以使用lazy屬性,默認lazy="true",啟用延遲載入
lazy="false"禁用延遲載入.
2)緩存機制
Hibernate每次查詢先去緩存中查找,沒有才去資料庫查詢.
a.一級緩存
Session級別的緩存,緩存load,get出來的單個對象.默認開啟.
使用同一個Session對象多次查詢同一個User對象,
只會發送一次SQL取資料庫獲取
b.二級緩存
SessionFactory級別的緩存.默認情況是關閉.
(1)首先在hibernate.cfg.xml中指定EhCache緩存策略
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
(2)在src下添加ehcache.xml配置文件
(3)在User.hbm.xml中添加<cache/>定義
<cache usage="read-only"/> ,如果涉及更新,使用read-write
c.查詢緩存
緩存HQL查詢結果集,對相同的HQL查詢語句,只去資料庫查詢一次.
H. 請簡述MyBatis和Hibernate的區別。
答:Hibernate和Mybatis都是orm對象關系映射框架,都是用於將數據持久化的框架技術。
Hiberante較深度的封裝了jdbc,對開發者寫sql的能力要求的不是那麼的高,我們只要通過hql語句操作對象即可完成對數據持久化的操作了。
另外hibernate可移植性好,如一個項目開始使用的是mysql資料庫,但是隨著業務的發展,現mysql資料庫已經無法滿足當前的綉球了,現在決定使用Oracle資料庫,雖然sql標準定義的資料庫間的sql語句差距不大,但是不同的資料庫sql標准還是有差距的,那麼我們手動修改起來會存在很大的困難,使用hibernate只需改變一下資料庫方言即可搞定。用hibernate框架,資料庫的移植變的非常方便。
但是hibernate也存在著諸多的不足,比如在實際開發過程中會生成很多不必要的sql語句耗費程序資源,優化起來也不是很方便,且對存儲過程支持的也不夠太強大。但是針對於hibernate它也提供了一些優化策略,比如說懶載入、緩存、策略模式等都是針對於它的優化方案。
Mybatis 也是對jdbc的封裝,但是封裝的沒有hibernate那麼深,我們可以再配置文件中寫sql語句,可以根據需求定製sql語句,數據優化起來較hibernate容易很多。
Mybatis要求程序員寫sql的能力要相對使用hibernate的開發人員要高的多,且可移植性也不是很好。
涉及到大數據的系統使用Mybatis比較好,因為優化較方便。涉及的數據量不是很大且對優化沒有那麼高,可以使用hibernate
I. 懶載入的介紹
在Web應用程序中,系統的瓶頸常在於系統的響應速度。如果系統響應速度過慢,用戶就會出現埋怨情緒,系統的價值也因此會大打折扣。因此,提高系統響應速度,是非常重要的。Web應用程序做的最多就是和後台資料庫交互,而查詢資料庫是種非常耗時的過程。當資料庫里記錄過多時,查詢優化更顯得尤為重要。為了解決這種問題,有人提出了緩存的概念。緩存就是將用戶頻繁使用的數據放在內存中以便快速訪問。在用戶執行一次查詢操作後,查詢的記錄會放在緩存中。當用戶再次查詢時,系統會首先從緩存中讀取,如果緩存中沒有,再查詢資料庫。緩存技術在一定程度上提升了系統性能,但是當數據量過大時,緩存就不太合適了。因為內存容量有限,把過多的數據放在內存中,會影響電腦性能。而另一種技術,懶載入可以解決這種問題。
J. 什麼是hibernate懶載入
所謂懶載入(lazy)就是延時載入,延遲載入。
什麼時候用懶載入呢,我只能回答要用懶載入的時候就用懶載入。
至於為什麼要用懶載入呢,就是當我們要訪問的數據量過大時,明顯用緩存不太合適,
因為內存容量有限 ,為了減少並發量,減少系統資源的消耗,
我們讓數據在需要的時候才進行載入,這時我們就用到了懶載入。
比如部門ENTITY和員工ENTITY,部門與員工1對多,如果lazy設置為false,那麼只要載入了一個部門的po,就會根據一對多配置的關系把所有員工的po也載入出來。但是實際上有時候只是需要用到部門的信息,不需要用到 員工的信息,這時員工po的載入就等於浪費資源。如果lazy設置為true,那麼只有當你訪問部門po的員工信息時候才回去載入員工的po的信息。