hibernate學習筆記(二級緩存) – JAVA編程語言程序開發技術文章

有人曾經問過gave king 問他hibernate最值得他驕傲的地方是什麼?大傢都以為他會說:是他提供的映射文件,面向對象化的操作。

而他卻說:最值得驕傲的是他的緩存機制:

hibernate的緩存機制分為一級緩存和二級緩存,一級緩存即sessio級別的。二級緩存是sessionFactory級別的。

 

在二級緩存中,它不僅可以保存在內存中,還可以保存在硬盤上。當然這種緩存機制主要是針對大量的數據進行操作。如果數據量較少,可以采用一級緩存。

我采用的EhCache緩存。ehcache 是一個非常輕量級的緩存實現。

實現二級緩存:

1.導入jar包;兩個:asm-attrs.jar,commons-logging-1.1.1.jar.

2.在主配置文件中添加屬性:

[java] 
<!– 使用二級緩存 –> 
    <property name="hibernate.cache.use_second_level_cache"> 
        true 
    </property> 
    <property name="hibernate.cache.provider_class"> 
        org.hibernate.cache.EhCacheProvider 
    </property> 
3.在映射文件中配置:<cache usage="read-only"/>

註意:在這有4個值:有必要對這4個值進行介紹。

A.transactional:保存可重復的事物隔離級別,對於讀/寫比例大,很少更新的數據通常可以采用這種方式。
B.read-write:使用timestamp機制維護已提交的事物隔離級別,對於讀/寫比例大,很少更新的數據通常可以采用這種方式。
C.nonstrict-read-write:二級緩存與數據庫中的數據可能會出現不一致的情況。應該設置足夠短的緩存過期時間。否則就有可能從緩存中讀取到臟數據,當一些數據很少改變(一天,兩天都不改變的數據)並且這些數據如果出現數據庫與緩存不一致的情況下影響並不大的時候,那麼可以采用這種緩存策略。

D.read-only:當確定數據不會被更改時。我們可以使用這種緩存策略。

4.編寫ehcache.xml文件。在src目錄下新建一個這個文件

[java]
<?xml version="1.0" encoding="UTF-8"?> 
<ehcache> 
<!– 如果內存放不下,就放到磁盤上的一個路徑 –> 
<diskStore path="d:/ehcache"/> 
<!– 內存中存放最多的對象個數 –> 
<defaultCache maxElementsInMemory="200" eternal="false"  
timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true" /> 
<!– 保存的對象 –> 
<cache name="com.test.bean.Student" maxElementsInMemory="200" eternal="false"  
timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true"/> 
</ehcache> 
配置基本上就完成瞭。

然後可以測試瞭。

[java] 
                     Session session1=sessionfactory.openSession(); 
Transaction tx1=session1.beginTransaction(); 
 
List<Student> list=session.createQuery("from Student s order by s.name asc").list(); 
for(Student stu:list){ 
    System.out.println(stu.getName()); 

tx1.commit(); 
System.out.println("—————————"); 
Session session2=sessionfactory.openSession(); 
Transaction tx2=session2.beginTransaction(); 
 
Student s1=(Student)session2.get(Student.class, "4028ab81386ed77b01386ed77d57000c"); 
Student s2=(Student)session2.get(Student.class, "4028ab81386ed77b01386ed77d570011"); 
 
System.out.println(s1.getName()); 
System.out.println(s2.getName()); 
tx2.commit(); 
開啟兩個session和兩個transaction。

如果不配置二級緩存的話。它肯定是執行3條sql,但是配置瞭。就可以將後兩條sql省略瞭。

over…
作者:yy008871

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。