1. 程式人生 > >Java面試題:Hibernate的二級快取與Hibernate多表查詢

Java面試題:Hibernate的二級快取與Hibernate多表查詢

我們來看兩個有關Java框架之Hibernate的面試題,這是關於Hibernate的常考知識點。

1、請介紹一下Hibernate的二級快取

解題按照以下思路來回答:

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

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

(3)最後再說如何配置Hibernate的二級快取。

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

引出hibernate的第二級快取,用下面的虛擬碼分析了Cache的實現原理。

Dao

{

hashmap map =new map();

User getUser(integer id)

{

User user = map.get(id)if(user ==null)

{

user = session.get(id);

map.put(id,user);

}return user;

}

}

Dao

{

Cache cache =nullsetCache(Cache cache)

{this.cache = cache

}

User getUser(int id)

{if(cache!=null)

{

User user = cache.get(id);if(user ==null)

{

user = session.get(id);

cache.put(id,user);

}return user;

}

returnsession.get(id);}}

上海尚學堂Java培訓 shsxt.com

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

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

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

2、Hibernate進行多表查詢每個表中各取幾個欄位,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決?

解決方案一,按照Object[]資料取出資料,然後自己組bean

解決方案二,對每個表的bean寫建構函式,比如表一要查出field1,field2兩個欄位,那麼有一個建構函式就是Bean(type1 filed1,type2

field2) ,然後在hql裡面就可以直接生成這個bean了。

歡迎工作一到八年的Java工程師朋友們加入Java高階交流群:828697593

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有直播平臺和講師直接交流噢

哦對了,喜歡就別忘了關注一下哦~