程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> hibernate3學習筆記(二十一)|二級緩存

hibernate3學習筆記(二十一)|二級緩存

編輯:關於JAVA

二級緩存及外部緩存,它能夠越過數個Session,通過同一個SessionFactory進行管理和維護。

接上例的代碼:http://blog.csdn.net/kunshan_shenbin/archive/2008/09/03/2874375.aspx

要使用二級緩存,首先需要對hibernate.cfg.xml文件進行修改:

1.<?xml version="1.0" encoding="utf-8"?>
2.<!DOCTYPE hibernate-configuration PUBLIC
3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
5.
6.<hibernate-configuration>
7.
8. <session-factory>
9.
10. ....
11. <property name="hibernate.cache.provider_class">
12. org.hibernate.cache.HashtableCacheProvider
13. </property>
14. ....
15.
16. </session-factory>
17.
18.</hibernate-configuration>

HashtableCache是Hibernate自己所提供的二級緩存的實現,但是由於其性能和功能有限,一般只用於開發和測試。

當然我們可以使用第三方的實現,譬如:org.hibernate.cache.EhCacheProvider,這個需要ehcathe.jar包。

修改User.hbm.xml文件:

1.<?xml version="1.0" encoding="utf-8"?>
2.<!DOCTYPE hibernate-mapping
3. PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
5.
6.<hibernate-mapping>
7.
8. <class name="com.hb3.pack_21.model.User" table="user">
9.
10. <cache usage="read-write"/>
11.
12. <id name="id" column="id" type="java.lang.Integer">
13. <generator class="native"/>
14. </id>
15.
16. <property name="name" column="name" type="java.lang.String"/>
17.
18. <many-to-one name="room"
19. column="room_id"
20. class="com.hb3.pack_21.model.Room"
21. cascade="save-update"
22. outer-join="true"/>
23.
24. </class>
25.
26.</hibernate-mapping>

這裡追加的策略有read-only、read-write、nonstrict-read-write以及transactional。不同的第三方緩存實現所支持的種類是不同的,請參閱:http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-cache

在工程的classpath下追加ehcache.xml文件,內容為:

1.<ehcache>
2.
3. <diskStore path="java.io.tmpdir"/>
4.
5. <defaultCache
6. maxElementsInMemory="10000"
7. eternal="false"
8. timeToIdleSeconds="120"
9. timeToLiveSeconds="120"
10. overflowToDisk="true"
11. />
12.
13.</ehcache>

測試代碼如下:

1.package com.hb3.pack_21;
2.
3.import java.io.IOException;
4.import java.sql.SQLException;
5.
6.import org.hibernate.Session;
7.import org.hibernate.SessionFactory;
8.import org.hibernate.cfg.Configuration;
9.
10.import com.hb3.pack_21.model.User;
11.
12.public class BusinessService {
13.
14. public static void main(String[] args) throws IOException, SQLException {
15.
16. Configuration config = new Configuration().configure();
17. SessionFactory sessionFactory = config.buildSessionFactory();
18. Session session = sessionFactory.openSession();
19.
20.
21. User user1 = (User) session.load(User.class, new Integer(1));
22. user1.getName();
23.
24. session.close();
25. session = sessionFactory.openSession();
26.
27. User user2 = (User) session.load(User.class, new Integer(1));
28. user2.getName();
29.
30.
31. session.close();
32. sessionFactory.close();
33. }
34.}

如果不使用二級緩存機制,生成的SQL文為:

Hibernate:
select user0_.id as id0_, user0_.name as name0_0_, user0_.age as age0_0_
from user user0_ where user0_.id=?
Hibernate:
select user0_.id as id0_, user0_.name as name0_0_, user0_.age as age0_0_
from user user0_ where user0_.id=?

使用後,第二級做相同的查詢會從二級緩存中讀取。

當然,如果打算從二級緩存中清空對象的緩存信息,可以使用SessionFactory的evict()方法,如:

sessionFactory.evict(User.class, user.getId());

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved