2011年5月13日 星期五

Hibernate 教學 - 一級與二級快取

通常快取的意思是要提升系統方面的效能,簡單作法即是將常用的資料放在快取區之內

而 Hibernate 也有類似的功能,基本上分為一級與二級的快取

也可以說是 Session 和 SessionFactory 的快取

先來看看一級快取這部份,它是屬於 Session 級的快取,其生命週期很短

以下以一個簡單的例子說明

//....
    Session session = HibernateUtil.getSession();  //取得一個 Session
    System.out.println("第一次查詢");

    Book book1 = (Book)session.get(Book.class, new Integer(1));
    System.out.println("書名 : " + book.getName());

    System.out.println("第二次查詢");
    
    Book book2 = (Book)session.get(Book.class, new Integer(1));
    System.out.println("書名 : " + book.getName());



以上範例,如果在程式中透過 Session 呼叫 load()、get()、save()、update() 這些方法時


Hibernate 都會對實體物件進行快取,通常在 load() 和 get() 方法來查詢資料時


Hibernate 會先到目前這個 Session 的快取區裏面找看看是否有相同的實體物件


如果找不到才會發出 SQL 語句去查詢否則就不發出 SQL 語句而直接使用該實體

所以再以上的程式中只會發出一條 SQL 的語句,如果是不同 Session 的話就不一樣了

也就是說一級快取他的生命週期是和 Session 相對應,但 Session 之間彼此不會分享快取內容

再來看看屬於 SessionFactory 級的二級快取,它就能夠達到再 Session 間彼此分享快取了

不過要達成二級快取之前必須先透過其他第三方的快取外掛才能達成,以下以 EHCache 來示範

首先先加入 EHCache 的配置文件 ehcache.xml 可以在你下載 Hibernate 的目錄下的 etc 目錄中找到

最後在 Hibernate 的配置文件中加入以下

<!-- 使用二級快取 -->
<property name="hibernate.cache.use_second_level_cache">true</property>

<!-- 指定為 EHCache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EHCacheProvider</property>

<!-- Book 的映射文件 -->
<mapping resource="org/pojo/Book.hbm.xml" >

<!-- 指定需採用二級快取的實體物件 -->
<class-cache class="org.pojo.Book" usage="read-only" >

沒有留言:

張貼留言