OSCache - 在Hibernate中使用

創建一個Java工程OSCacheTest,在其中引入Hibernate 3.2的類庫文件。因爲需要使用OSCache,還需要引入oscache-2.1.jar包。
一般使用OSCache緩存需要進行三個步驟的配置,具體如下:
[color=blue][b]步驟一:在Hibernate中配置OSCache[/b][/color]
1. 在Hibernate配置文件中打開二級緩存的配置,如下:
<property name="cache.use_second_level_cache">true</property>
2. 這個值在配置文件中,缺省是打開的。這只是打開二級緩存,並沒有指定使用哪個二級緩存。所以需要指定使用的何種二級緩存。配置如下:
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
特別注意:關於二級緩存的配置,必須在<mapping resource="…………" />配置之前,否則報錯

[color=blue][b]步驟二:配置OSCache配置文件[/b][/color]
關於緩存中存放多少數據,Hibernate是不關心的,全部由OSCache來完成。需要將OSCache的配置文件oscache.properties放入classpath中(注意不能修改這個文件名),對二級緩存進行具體配置。
在oscache.properties中,有如下的參數配置:cache.capacity=1000
這個數值代表放入緩存的對象數量,這個數量根據用戶機器的內存來配置,一般只需要配置這個參數即可。

[color=blue][b]步驟三:通知Hibernate那些類需要OSCache進行緩存[/b][/color]
這個步驟有兩種方式可以使用,其作用相同:
第1種:在hibernate.cfg.xml的session-factory中加入:
<class-cache usage="read-only" class="com.mixele.oscache.entity.UserOS"/>
第2種:在映射文件的class元素加入子元素:<class-cache usage="read-only" />

關於usage屬性,有4個值可以配置:
read-only:只讀,緩存效率最高,用於不更新的數據
read-write:可讀寫
nonstrict-read-write:用於不重視併發修改的操作(會出現一定的錯誤數據,即不同步數據)
transactional:事務緩存,可支持事務回滾(OSCache中沒有此項功能)

經過以上配置,OSCache緩存就已經生效。
編寫測試程序:
Hibernate配置:

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/cachetest</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>

<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>

<property name="generate_statistics">true</property>
<mapping resource="com/mixele/oscache/entity/UserOS.hbm.xml" />
</session-factory>
</hibernate-configuration>



POJO類及hbm:

public class UserOS {
private int id;
private String name;
private Date birthday;
………………
}


<hibernate-mapping package="com.mixele.oscache.entity">
<class name="UserOS">
<cache usage="read-only"/>
<id name="id"> <generator class="native"/> </id>
<property name="name" length="100"/>
<property name="birthday"/>
</class>
</hibernate-mapping>



緩存測試類:

public class CacheTest{
public static void main(String [] args) {
int num = 1;
DataPutInDB.saveData(num);
for(int i=0;i<num;i++) {
getOSCacheCache(i+1);
}
Statistics st = HibernateUtil.getSessionfactory().getStatistics();
System.out.println("輸出統計信息............");
System.out.println(st);
System.out.println("放入: "+st.getSecondLevelCachePutCount()+"次");
System.out.println("命中: "+st.getSecondLevelCacheHitCount()+"次");
System.out.println("失去: "+st.getSecondLevelCacheMissCount()+"次");
}

static UserOS getOSCacheCache(int id) {
Session s = null;
UserOS useros = null;
try{
s = HibernateUtil.getSession();
useros = (UserOS)s.get(UserOS.class, id);//第一次查詢,二級緩存中沒有信息,miss一次
useros = (UserOS)s.load(UserOS.class, id);//第二次查詢,在一級緩存中找到,不進入二級緩存
s.clear();//清空一級緩存
}finally{
if(s != null){
s.close();
}
}
for(int i=1;i<101;i++){
try{
s = HibernateUtil.getSession();
useros = (UserOS)s.get(UserOS.class, id);//在二級緩存中找到,hit兩次
System.out.println("第"+i+"次從二級緩存查找 "+useros.getClass());
}finally{
if(s != null){ s.close(); }
}
}
return useros;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章