posts - 66,  comments - 11,  trackbacks - 0
            基于Java的緩存實(shí)現(xiàn),最簡單的方式莫過于對(duì)集合類數(shù)據(jù)類型進(jìn)行封裝。Hibernate提供了基于Hashtable的緩存實(shí)現(xiàn)機(jī)制,不過,由于其性能和功能上的局限,僅供開發(fā)調(diào)試中使用。同時(shí),Hibernate還提供了面向第三方緩存實(shí)現(xiàn)的接口,如:
          HashTable--------------------------------net.sf.hibernate.cache.HashtableCacheProvider
          1、JSC
          2、EHCache->默認(rèn)的二級(jí)Cache實(shí)現(xiàn)。--------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
          相對(duì)于JSC而言,EHCache更加穩(wěn)定,并具備更好的混存調(diào)度性能,其缺陷是目前還無法做到分布式緩存。
          首先設(shè)置hibernate.cfg.xml然后設(shè)置ehcache.xml最后設(shè)置緩存策略。

            緩存同步策略決定了數(shù)據(jù)對(duì)象在緩存中的存取規(guī)則。為了使得緩存調(diào)度遵循正確的應(yīng)用級(jí)事物隔離機(jī)制,我們必須為每個(gè)實(shí)體類指定相應(yīng)的緩存同步策略。Hibernate提供4種內(nèi)置的緩存同步策略:
          1、read-only:只讀。對(duì)于不會(huì)發(fā)生改變的數(shù)據(jù),可使用只讀型緩存。
          2、nonstrict-read-write:如果程序?qū)Σl(fā)訪問下的數(shù)據(jù)同步要求不是非常嚴(yán)格,且數(shù)據(jù)更新操作頻率較低,可以采用本選項(xiàng)。
          3、read-write:嚴(yán)格可讀寫緩存。
          4、transactional:事務(wù)型緩存,必須運(yùn)行在JTA事物環(huán)境中。

            JDBC事物由Connection管理,也就是說,事務(wù)管理實(shí)際上是在JDBC Connection中實(shí)現(xiàn)。事務(wù)周期限于Connection的生命周期之類。同樣,對(duì)于基于JDBC Transaction的Hibernate事務(wù)管理機(jī)制而言,事物管理在Session所以托的JDBCConnection中實(shí)現(xiàn),事務(wù)周期限于Session的生命周期。
            JTA事物管理則由JTA容器實(shí)現(xiàn),JTA容器對(duì)當(dāng)前加入事物的眾多Connection進(jìn)行調(diào)度,實(shí)現(xiàn)其事務(wù)性要求。JTA的事物周期可橫跨多個(gè)JDBC Connectin生命周期。同樣對(duì)于基于JTA事務(wù)的Hibernate而言,JTA事物橫跨多個(gè)Session.

            Hibernate支持2種鎖機(jī)制:即通常所說的悲觀鎖和樂觀鎖。
            悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機(jī)制。典型的悲觀鎖調(diào)用:
            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();
                      
          //創(chuàng)建sessionFactory對(duì)象
                      SessionFactory sessionFactory = config.buildSessionFactory();
                      
          //創(chuàng)建session
                      session = sessionFactory.openSession();
                  } 
          catch (HibernateException e) {
                      e.printStackTrace();
                  }        
              }
              
          /**
               * 悲觀鎖
               * Hibernate的加鎖模式有:
               * 1、LockMode.NONE:無鎖機(jī)制
               * 2、LockMode.WRITE:Hibernate在Insert和Update記錄的時(shí)候會(huì)自動(dòng)獲取
               * 3、LockMode.READ:Hibernate在讀取記錄的時(shí)候會(huì)自動(dòng)獲取
               * 上述3種鎖機(jī)制為了保證update過程中對(duì)象不會(huì)被外界修改,在目標(biāo)對(duì)象上加鎖,與數(shù)據(jù)庫無關(guān)
               * 4、LockMode.UPGRADE:利用數(shù)據(jù)庫的for update子句加鎖
               * 5、LockMode.UPGRADE_NOWAIT:oracle的特定實(shí)現(xiàn)
               * 注意:只有在查詢開始之前設(shè)定加鎖,才會(huì)真正通過數(shù)據(jù)庫的鎖機(jī)制進(jìn)行加鎖處理。
               
          */
              
          public void addPessimismLock(){
                  String hqlStr 
          = "from TUser as user where user.name='Erica'";
                  Query query 
          = session.createQuery(hqlStr);
                  query.setLockMode(
          "user",LockMode.UPGRADE);//多所有返回的user對(duì)象加鎖
                  List userList = query.list();//執(zhí)行查詢
              }
              
          /**
               * 樂觀鎖
               * 數(shù)據(jù)版本:即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),在基于數(shù)據(jù)庫表的版本解決方案中,一般是通過為數(shù)據(jù)庫表增加一個(gè)version字段來實(shí)現(xiàn)。
               * 讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加1.此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫對(duì)應(yīng)記錄的當(dāng)前版本信息
               * 進(jìn)行比對(duì),如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫表當(dāng)前版本號(hào),則予以更新,否則認(rèn)為是過期數(shù)據(jù)。
               * 
               * Hibernate在其數(shù)據(jù)訪問引擎中內(nèi)置了樂觀鎖實(shí)現(xiàn)。如果不考慮外部系統(tǒng)對(duì)數(shù)據(jù)庫的更新操作,利用Hibernate提供的透明化樂觀鎖
               * 實(shí)現(xiàn),將大大提升我們的生產(chǎn)力。見配置文件T_USER.hbm.xml
               * 樂觀鎖機(jī)制避免了長事務(wù)中的數(shù)據(jù)加鎖開銷,大大提升了大并發(fā)量下的系統(tǒng)整體性能表象。
               *
               
          */
              
          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();
              }
              
          /**
               * 關(guān)閉資源
               
          */
              
          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:通過版本機(jī)制實(shí)現(xiàn)樂觀鎖
                  dirty:通過檢查發(fā)生變動(dòng)過的屬性實(shí)現(xiàn)樂觀鎖
                  all通過檢查所有屬性實(shí)現(xiàn)樂觀鎖
               
          -->
              
          <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 王永慶 閱讀(566) 評(píng)論(0)  編輯  收藏 所屬分類: HIBERNATE
          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          關(guān)注blogs

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 柳江县| 交口县| 宁阳县| 明溪县| 玛沁县| 运城市| 夏津县| 香港| 宁武县| 丰县| 乌兰县| 新田县| 漳州市| 乳源| 安顺市| 余干县| 安国市| 乐昌市| 柳林县| 深水埗区| 南岸区| 墨玉县| 滨海县| 定襄县| 庆元县| 饶平县| 阜康市| 元江| 饶河县| 英山县| 贺州市| 宁陵县| 桓仁| 额尔古纳市| 凭祥市| 临邑县| 玉环县| 永康市| 白银市| 沾益县| 德格县|