1. 程式人生 > >Java面試原題:介紹一下hibernate的二級快取

Java面試原題:介紹一下hibernate的二級快取

按照以下思路來回答:

(1)、首先說清楚什麼是快取

(2)、再說有了hibernate的session就是一級快取,即:有了一級快取為什麼還要二級快取

(3)、最後在說如何配置hibernate的二級快取​

滿分回答:​

​1、快取就是把以前從資料庫中查詢出來和使用過的物件儲存到記憶體中(一個數據庫結構中),這個資料庫結構通常是或類似HashMap,當以後要使用某個物件時,先查詢快取中是否有這個物件,如果有則使用快取中的物件,如果沒有則去查詢資料庫,並將查詢出來的物件儲存到快取中,以便下次使用。

下面是快取的虛擬碼:

引出hibernate的第二級快取,用下面的程式碼分析了Cache的實現原理​

//map快取​

Dao{

hashmap map=newmap();

User getUser(integerid)​;

}​

User user=map.get(id)

if(user==null){

user=session.get(id);

map.put(id,user);

}​

return user;​

}

}

//cache快取

Dao{

Cache cache=null

setCache(Cacheche){

this.cache=cache

}​

User getUser(int id)​

}​

if(chche!=null){

Useruser=cache.get(id);

if(user==null){

user=session.get(id);

cache.put(id,user);

}​

returnuser;​

}​

returnsession.get(id);

}

}​

2、hibernate的session就是一種快取,我們通常將其稱為hibernate的一級快取,當想使用session從資料庫中查詢出一個物件時,session也是先從自己內部檢視是否存在這個物件,存在則直接返回,不存在才去訪問資料庫,並將查詢的結果儲存在自己內部,由於session代表一次會話過程,一個session與資料庫連線相關聯,所以session最好不要長時間保持開啟,通常僅用於一個事務當中,在事務結束時就應關閉。並且session是執行緒不安全的,被多個執行緒共享時容易出現問題,通常只有那種全域性意義上的快取才是真正意義的快取應用,才有較大的快取價值,因此,hibenrte的session這一級快取作用並不明顯,應用價值不大,hibernate的二級快取就是要為hibernate配置一種全域性快取,讓多個執行緒和多個事務都可以共享這個快取,我們希望的時一個人使用過,其他人也可以使用,session沒有這種效果。​

3、​二級快取時獨立於hibenate的軟體部件,屬於第三方產品,多個廠商和組織都提供有快取產品,例如EHCache和OSCake等等。在hibernate中使用二級快取,首先就要在hibernate.config.xml配置檔案中配置使用哪個廠家的快取產品,接著需要配置這快取產品自己的配置檔案,最後配置hibernate中的哪些實體物件要納入二級快取的管理中。明白了二級快取的原理和有了這個思路後,很容易配置起hibernate的二級快取

擴充套件知識:一個SessionFactory可以關聯一個二級快取,也即一個二級快取只能負責快取一個數據庫中的資料,當時用hibernate的二級快取後,注意不要有其他的應用或SessionFactory來更改當前資料庫中的資料,這樣快取的資料就會與資料庫中的實際資料不一致。​