基于Java的緩存實現,最簡單的方式莫過于對集合類數據類型進行封裝。Hibernate提供了基于Hashtable的緩存實現機制,不過,由于其性能和功能上的局限,僅供開發調試中使用。同時,Hibernate還提供了面向第三方緩存實現的接口,如:
HashTable--------------------------------net.sf.hibernate.cache.HashtableCacheProvider
1、JSC
2、EHCache->默認的二級Cache實現。--------net.sf.encache.hibernate.Provider
3、OSCache-------------------------------net.sf.hibernate.cache.OSCacheProvider
4、JBoss Cache->分布式緩存---------------net.sf.hibernate.cache.TreeCacheProvider
5、SwarmCache----------------------------net.sf.hibernate.cache.SwarmCacheProvider
相對于JSC而言,EHCache更加穩定,并具備更好的混存調度性能,其缺陷是目前還無法做到分布式緩存。
首先設置hibernate.cfg.xml然后設置ehcache.xml最后設置緩存策略。
緩存同步策略決定了數據對象在緩存中的存取規則。為了使得緩存調度遵循正確的應用級事物隔離機制,我們必須為每個實體類指定相應的緩存同步策略。Hibernate提供4種內置的緩存同步策略:
1、read-only:只讀。對于不會發生改變的數據,可使用只讀型緩存。
2、nonstrict-read-write:如果程序對并發訪問下的數據同步要求不是非常嚴格,且數據更新操作頻率較低,可以采用本選項。
3、read-write:嚴格可讀寫緩存。
4、transactional:事務型緩存,必須運行在JTA事物環境中。
JDBC事物由Connection管理,也就是說,事務管理實際上是在JDBC Connection中實現。事務周期限于Connection的生命周期之類。同樣,對于基于JDBC Transaction的Hibernate事務管理機制而言,事物管理在Session所以托的JDBCConnection中實現,事務周期限于Session的生命周期。
JTA事物管理則由JTA容器實現,JTA容器對當前加入事物的眾多Connection進行調度,實現其事務性要求。JTA的事物周期可橫跨多個JDBC Connectin生命周期。同樣對于基于JTA事務的Hibernate而言,JTA事物橫跨多個Session.
Hibernate支持2種鎖機制:即通常所說的悲觀鎖和樂觀鎖。
悲觀鎖的實現,往往依靠數據庫提供的鎖機制。典型的悲觀鎖調用:
select * from account where name=="Erica" for update
package com.hibernate.higherApplication;
import java.util.List;
import junit.framework.TestCase;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;
public class LockOperator extends TestCase {
private Session session = null;
/**
* 初始化資源
*/
protected void setUp() throws Exception {
try {
//加載類路徑下的hibernate.cfg.xml文件
Configuration config = new Configuration().configure();
//創建sessionFactory對象
SessionFactory sessionFactory = config.buildSessionFactory();
//創建session
session = sessionFactory.openSession();
} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* 悲觀鎖
* Hibernate的加鎖模式有:
* 1、LockMode.NONE:無鎖機制
* 2、LockMode.WRITE:Hibernate在Insert和Update記錄的時候會自動獲取
* 3、LockMode.READ:Hibernate在讀取記錄的時候會自動獲取
* 上述3種鎖機制為了保證update過程中對象不會被外界修改,在目標對象上加鎖,與數據庫無關
* 4、LockMode.UPGRADE:利用數據庫的for update子句加鎖
* 5、LockMode.UPGRADE_NOWAIT:oracle的特定實現
* 注意:只有在查詢開始之前設定加鎖,才會真正通過數據庫的鎖機制進行加鎖處理。
*/
public void addPessimismLock(){
String hqlStr = "from TUser as user where user.name='Erica'";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE);//多所有返回的user對象加鎖
List userList = query.list();//執行查詢
}
/**
* 樂觀鎖
* 數據版本:即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個version字段來實現。
* 讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加1.此時,將提交數據的版本數據與數據庫對應記錄的當前版本信息
* 進行比對,如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。
*
* Hibernate在其數據訪問引擎中內置了樂觀鎖實現。如果不考慮外部系統對數據庫的更新操作,利用Hibernate提供的透明化樂觀鎖
* 實現,將大大提升我們的生產力。見配置文件T_USER.hbm.xml
* 樂觀鎖機制避免了長事務中的數據加鎖開銷,大大提升了大并發量下的系統整體性能表象。
*
*/
public void addOptimismLock(){
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
List userList = criteria.list();
TUser user = (TUser)userList.get(0);
Transaction tx = session.beginTransaction();
user.setVersion(1);
tx.commit();
}
/**
* 關閉資源
*/
protected void tearDown() throws Exception {
try{
session.close();
}catch(HibernateException e){
e.printStackTrace();
}
}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--
none:無樂觀鎖
version:通過版本機制實現樂觀鎖
dirty:通過檢查發生變動過的屬性實現樂觀鎖
all通過檢查所有屬性實現樂觀鎖
-->
<class
name="org.hibernate.sample.TUSER"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version"
lazy="true"
>
<id
name="id"
column="id"
type="java.lang.Integer"
>
<generator class="native">
</generator>
</id>
<version name="version" column="version" type="java.lang.Integer">
</version>
<set name="addresses"
table="t_address"
lazy="true"
inverse="false"
cascade="all"
>
<key
column="user_id"
>
</key>
<one-to-many class=""/>
</set>
</class>
</hibernate-mapping>
posted on 2010-01-02 15:25
王永慶 閱讀(561)
評論(0) 編輯 收藏 所屬分類:
HIBERNATE