<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 66,  comments - 11,  trackbacks - 0
    package com.hibernate.higherApplication;

    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;

    import junit.framework.TestCase;

    import org.hibernate.Criteria;
    import org.hibernate.Hibernate;
    import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.criterion.Expression;

    public class DurationOperator extends TestCase {
        
    private SessionFactory sessionFactory = null;
        
    private Session session = null;
        
    /**
         * 初始化資源
         
    */
        
    protected void setUp() throws Exception {
            
    try {
                
    //加載類路徑下的hibernate.cfg.xml文件
                Configuration config = new Configuration().configure();
                
    //創(chuàng)建sessionFactory對象
                sessionFactory = config.buildSessionFactory();
                
    //創(chuàng)建session
                session = sessionFactory.openSession();
            } 
    catch (HibernateException e) {
                e.printStackTrace();
            }
        }
        
    /**
         * load/get方法均可以根據(jù)指定的實(shí)體類和id從數(shù)據(jù)庫讀取記錄,并返回與之對應(yīng)的實(shí)體對象。
         * 區(qū)別在于:
         * 1、如果未發(fā)現(xiàn)符合條件的記錄,get方法返回null,而load方法拋出一個(gè)ObjectNotFoundException
         * 2、load方法可以返回實(shí)體的代理類實(shí)例,而get方法永遠(yuǎn)直接返回實(shí)體類。
         * 3、load方法可以充分利用內(nèi)部緩存和二級緩存中的現(xiàn)有數(shù)據(jù),而get方法則僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找,如果
         * 沒有發(fā)現(xiàn)數(shù)據(jù),將越過二級緩存,直接調(diào)用SQL完成數(shù)據(jù)讀取。
         *
         
    */
        
    public void loadOrGetData(){
            TUser user 
    = (TUser)session.load(TUser.class,new Integer(1));
        }
        
    /**
         * 查詢性能往往是一系統(tǒng)性能表現(xiàn)的一個(gè)重要方面。
         * query.list方法通過一條select SQL實(shí)現(xiàn)了查詢操作,而iterate方法,則執(zhí)行了3次selectSQL,第一次獲取了所有符合條件的記錄
         * 的id,之后,在根據(jù)各個(gè)id從庫表中讀取對應(yīng)的哦記錄,這是一個(gè)典型的N+1次查詢問題。
         * 
         * 我們進(jìn)行query.list數(shù)據(jù)查詢時(shí),即使緩存中已經(jīng)有一些符合條件的實(shí)體對象存在,我們也無法保證這些數(shù)據(jù)就是庫表中所有符合條件的數(shù)據(jù)。假設(shè)
         * 第一次查詢條件是age>25,隨即緩存中就包括了所有age>25的user數(shù)據(jù);第二次查詢條件為age>20,此時(shí)緩存中雖然包含了滿足age>25d的
         * 數(shù)據(jù),但這些并不是滿足條件age>20的全部數(shù)據(jù)
         * 因此,query.list方法還是需要執(zhí)行一次select sql以保證查詢結(jié)果的完整性(iterate方法通過首先查詢獲取所有符合條件記錄的id,以此保證
         * 查詢結(jié)果的完整性)。
         * 因此,query.list方法實(shí)際上無法利用緩存,它對緩存只寫不讀。而iterate方法則可以充分發(fā)揮緩存帶來的優(yōu)勢,如果目標(biāo)數(shù)據(jù)只讀或者讀取相對
         * 較為頻繁,通過這種機(jī)制可以大大減少性能上的損耗。
         
    */
        
    public void queryForList(){
            String hql 
    = "from TUser where age>?";
            Query query 
    = session.createQuery(hql);
            query.setInteger(
    1,1);
            
            List list 
    = query.list();
            
            
    for(int i=0;i<list.size();i++){
                TUser user 
    = (TUser)list.get(i);
                System.out.println(
    "User age:"+user.getAge());
            }
        }
        
    public void queryForIterate(){
            String hql 
    = "from TUser where age>?";
            Query query 
    = session.createQuery(hql);
            query.setInteger(
    1,1);
            
            Iterator it 
    = query.iterate();
            
            
    while(it.hasNext()){
                TUser user 
    = (TUser)it.next();
                System.out.println(
    "User age:"+user.getAge());
            }
        }
        
    /**
         * 大數(shù)據(jù)量的批量讀取(10W條)
         * 解決方案:結(jié)合iterate方法和evict方法逐條對記錄進(jìn)行處理,將內(nèi)存消耗保持在可以接受的范圍之內(nèi)。
         * 在實(shí)際開發(fā)中,對于大批量數(shù)據(jù)處理,還是推薦采用SQL或存儲(chǔ)過程實(shí)現(xiàn),以獲得較高的性能,并保證系統(tǒng)平滑運(yùn)行。
         
    */
        
    public void bigDataRead(){
            String hql 
    = "from TUser where age>?";
            Query query 
    = session.createQuery(hql);
            query.setInteger(
    "age"1);
            Iterator it 
    = query.iterate();
            
            
    while(it.hasNext()){
                TUser user 
    = (TUser)it.next();
                
    //將對象從一級緩存中移除
                session.evict(user);
                
    //二級緩存可以設(shè)定最大數(shù)據(jù)緩存數(shù)量,達(dá)到峰值時(shí)會(huì)自動(dòng)對緩存中的較老數(shù)據(jù)進(jìn)行廢除,但是我們這里還是通過
                
    //編碼指定將對象從二級緩存中移除,這有助保持緩存的數(shù)據(jù)有效性。
                sessionFactory.evict(TUser.class,user.getId());
            }
        }
        
    /**
         * Query Cache彌補(bǔ)了find方法的不足,QueryCache中緩存的SQL及其結(jié)果及并非永遠(yuǎn)存在,當(dāng)Hibernate發(fā)現(xiàn)此SQL對應(yīng)的庫表發(fā)生變動(dòng),
         * 會(huì)自動(dòng)將Query Cache中對應(yīng)表的SQL緩存廢除。因此Query Cache只在特定的情況下產(chǎn)生作用:
         * 1、完全相同的select SQL重復(fù)執(zhí)行。
         * 2、在2次查詢之間,此select SQL對應(yīng)的庫表沒有發(fā)生過改變。
         
    */
        
    public void queryForQueryCache(){
            String hql 
    = "from TUser where age>?";
            Query query 
    = session.createQuery(hql);
            query.setInteger(
    11);
            
    //除了在這里設(shè)置QueryCache外,還要在hibernate.cfg.xml中進(jìn)行設(shè)置
            
    //<property name="hibernate.cache.use_query_cache">true</property>
            query.setCacheable(true);
            List userList 
    = query.list();
        }
        
    /**
         * 所謂延遲加載,就是在需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。
         * 延遲加載實(shí)現(xiàn)主要針對:
         * 1、實(shí)體對象:通過class的lazy屬性,我們可以打開實(shí)體對象的延遲加載功能。
         * 2、集合
         
    */
        
    public void queryForEntityLazy(){
            Criteria criteria 
    = session.createCriteria(TUser.class);
            criteria.add(Expression.eq(
    "name","Erica"));
            
            List userList 
    = criteria.list();
            TUser user 
    = (TUser)userList.get(0);
            
    //雖然使用了延遲加載,但是我們可以通過hibernate的初始化方法進(jìn)行強(qiáng)制加載,這樣即使session關(guān)閉之后,關(guān)聯(lián)的對象仍讓可以使用
            Hibernate.initialize(user.getAddresses());
            
            System.out.println(
    "User name=>"+user.getAge());
            
            Set hset 
    =user.getAddresses();
            TAddresses addr 
    = (TAddresses)hset.toArray()[0];
            System.out.println(addr.getAddress());
            
            session.close();
        }
        
    /**
         * 關(guān)閉資源
         
    */
        
    protected void tearDown() throws Exception {
            
    try{
                session.close();
            }
    catch(HibernateException e){
                e.printStackTrace();
            }
        }

    }
    posted @ 2010-01-02 15:27 王永慶 閱讀(370) | 評論 (0)編輯 收藏
      基于Java的緩存實(shí)現(xiàn),最簡單的方式莫過于對集合類數(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)的二級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
    相對于JSC而言,EHCache更加穩(wěn)定,并具備更好的混存調(diào)度性能,其缺陷是目前還無法做到分布式緩存。
    首先設(shè)置hibernate.cfg.xml然后設(shè)置ehcache.xml最后設(shè)置緩存策略。

      緩存同步策略決定了數(shù)據(jù)對象在緩存中的存取規(guī)則。為了使得緩存調(diào)度遵循正確的應(yīng)用級事物隔離機(jī)制,我們必須為每個(gè)實(shí)體類指定相應(yīng)的緩存同步策略。Hibernate提供4種內(nèi)置的緩存同步策略:
    1、read-only:只讀。對于不會(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的生命周期之類。同樣,對于基于JDBC Transaction的Hibernate事務(wù)管理機(jī)制而言,事物管理在Session所以托的JDBCConnection中實(shí)現(xiàn),事務(wù)周期限于Session的生命周期。
      JTA事物管理則由JTA容器實(shí)現(xiàn),JTA容器對當(dāng)前加入事物的眾多Connection進(jìn)行調(diào)度,實(shí)現(xiàn)其事務(wù)性要求。JTA的事物周期可橫跨多個(gè)JDBC Connectin生命周期。同樣對于基于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對象
                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過程中對象不會(huì)被外界修改,在目標(biāo)對象上加鎖,與數(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對象加鎖
            List userList = query.list();//執(zhí)行查詢
        }
        
    /**
         * 樂觀鎖
         * 數(shù)據(jù)版本:即為數(shù)據(jù)增加一個(gè)版本標(biāo)識,在基于數(shù)據(jù)庫表的版本解決方案中,一般是通過為數(shù)據(jù)庫表增加一個(gè)version字段來實(shí)現(xiàn)。
         * 讀取出數(shù)據(jù)時(shí),將此版本號一同讀出,之后更新時(shí),對此版本號加1.此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫對應(yīng)記錄的當(dāng)前版本信息
         * 進(jìn)行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號,則予以更新,否則認(rèn)為是過期數(shù)據(jù)。
         * 
         * Hibernate在其數(shù)據(jù)訪問引擎中內(nèi)置了樂觀鎖實(shí)現(xiàn)。如果不考慮外部系統(tǒng)對數(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 @ 2010-01-02 15:25 王永慶 閱讀(569) | 評論 (0)編輯 收藏
        實(shí)體對象,特指Hibernate O/R映射關(guān)系中的域?qū)ο蟆?shí)體對象生命周期中的3種狀態(tài)
        1、Transient(自由狀態(tài)):所謂Transient,即實(shí)體對象在內(nèi)存中的自由存在,它與數(shù)據(jù)庫中的記錄無關(guān)。
        2、Persistent(持久狀態(tài)):即實(shí)體對象處于由Hibernate框架所管理的狀態(tài)。
        3、Detached(游離狀態(tài)):處于Persistent狀態(tài)的對象,其對應(yīng)的Session實(shí)例關(guān)閉之后,那么,此對象就處于"Detached"狀態(tài)。
        Transient狀態(tài)的user對象與庫表的數(shù)據(jù)缺乏對應(yīng)關(guān)系,而Detached狀態(tài)的user對象,卻在庫表中存在對應(yīng)的記錄,只不過由于Detached對象脫離了session這個(gè)數(shù)據(jù)操作平臺,其狀態(tài)的變化無法更新到庫表中的對應(yīng)記錄。
        處于Transient和Detached狀態(tài)的對象統(tǒng)稱為值對象(VO),而處于Persistent狀態(tài)的對象稱為持久對象(PO).這是站在實(shí)體對象是否被納入Hibernate實(shí)體管理容器的立場加以區(qū)分的,非管理的實(shí)體對象統(tǒng)稱為VO,而被管理的實(shí)體對象稱為PO.
    VO與PO的主要區(qū)別在于:
    1、VO是相對獨(dú)立的實(shí)體對象,處于非管理狀態(tài)。
    2、PO是由Hibernate納入其實(shí)體管理容器的對象,它代表了與數(shù)據(jù)庫中某條記錄對應(yīng)的Hibernate實(shí)體,PO的變化在事務(wù)提交時(shí)將反映到實(shí)際數(shù)據(jù)庫中
    3、如果一個(gè)PO與其對應(yīng)的Session實(shí)例分離,那么此時(shí),它又會(huì)變成一個(gè)VO。

        不覆蓋equals/hashCode方法的情況下我們要面對的問題:實(shí)體對象的跨session識別。解決辦法一個(gè)是實(shí)現(xiàn)所謂的值比對,即在equals/hashCode方法中,對實(shí)體類的所有屬性值進(jìn)行比對.除了值比對,還有另外一種基于業(yè)務(wù)邏輯的對象判定方式業(yè)務(wù)關(guān)鍵信息判定。

        tx.commint();方法中會(huì)調(diào)用session.flush()方法,在flush()方法中會(huì)執(zhí)行2個(gè)主要任務(wù)
    1、flushEverything();//刷新所有數(shù)據(jù)
    2、execute(0);//執(zhí)行數(shù)據(jù)庫SQL完成持久化動(dòng)作。

        數(shù)據(jù)緩存:在特定硬件基礎(chǔ)上緩存往往是提升系統(tǒng)性能的關(guān)鍵因素。緩存是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時(shí)容器,它包含了庫表數(shù)據(jù)在內(nèi)存中的臨時(shí)拷貝,位于數(shù)據(jù)庫與數(shù)據(jù)訪問層之間。ORM在進(jìn)行數(shù)據(jù)讀取時(shí),會(huì)根據(jù)其緩存管理策略,首先在緩存中查詢,如果在緩存中發(fā)現(xiàn)所需數(shù)據(jù),則直接以此數(shù)據(jù)作為查詢結(jié)果加以利用,從而避免了數(shù)據(jù)庫調(diào)用的性能開銷。
        相對內(nèi)存操作而言,數(shù)據(jù)庫調(diào)用是一個(gè)代價(jià)高昂的過程,對于典型企業(yè)及應(yīng)用結(jié)構(gòu),數(shù)據(jù)庫往往與應(yīng)用服務(wù)器位于不同的物理服務(wù)器,這也就意味著每次數(shù)據(jù)庫訪問都是一次遠(yuǎn)程調(diào)用,Socket的創(chuàng)建與銷毀,數(shù)據(jù)的打包拆包,數(shù)據(jù)庫執(zhí)行查詢命令,網(wǎng)絡(luò)傳輸上的延時(shí),這些消耗都給系統(tǒng)整體性能造成了嚴(yán)重影響。
        ORM的數(shù)據(jù)緩存應(yīng)包含如下幾個(gè)層次:
    1、事務(wù)級緩存:事務(wù)級緩存是基于Session生命周期實(shí)現(xiàn)的,每個(gè)Session會(huì)在內(nèi)部維持一個(gè)數(shù)據(jù)緩存,此緩存隨著Session的創(chuàng)建而存在,因此也成為Session Level Cache(內(nèi)部緩存)
    2、應(yīng)用級/進(jìn)程級緩存:在某個(gè)應(yīng)用中,或者應(yīng)用中某個(gè)獨(dú)立數(shù)據(jù)訪問子集中的共享緩存。此緩存可由多個(gè)事物共享。在Hibernate中,應(yīng)用級緩存在SessinFactory層實(shí)現(xiàn),所有由此SessionFactory創(chuàng)建的Session實(shí)例共享此緩存。多實(shí)例并發(fā)運(yùn)行的環(huán)境要特別小心進(jìn)程級緩存的調(diào)用。
    3、分布式緩存:分布式緩存由多個(gè)應(yīng)用級緩存實(shí)例組成集群,通過某種遠(yuǎn)程機(jī)制實(shí)現(xiàn)各個(gè)緩存實(shí)例間的數(shù)據(jù)同步,任何一個(gè)實(shí)例的數(shù)據(jù)修改操作,將導(dǎo)致整個(gè)集群間的數(shù)據(jù)狀態(tài)同步。由于多個(gè)實(shí)例間的數(shù)據(jù)同步機(jī)制,每個(gè)緩存實(shí)例發(fā)生的變動(dòng)都會(huì)復(fù)制到其余所有節(jié)點(diǎn)中,這樣的遠(yuǎn)程同步開銷不可忽視。

        Hibernate數(shù)據(jù)緩存分為2個(gè)層次,1、內(nèi)部緩存2、二級緩存hibernate中,緩存將在以下情況中發(fā)揮作用:
    1、通過ID加載數(shù)據(jù)時(shí)
    這包括了根據(jù)id查詢數(shù)據(jù)的Session.load方法,以及Session.ierate等批量查詢方法
    2、延遲加載

        Session在進(jìn)行數(shù)據(jù)查詢操作時(shí),會(huì)首先在自身內(nèi)部的一級緩存中進(jìn)行查找,如果一級緩存未能命中,則將在二級緩存中查詢,如果二級緩存命中,則以此數(shù)據(jù)作為結(jié)果返回。
        如果數(shù)據(jù)滿足以下條件,則可將其納入緩存管理
    1、數(shù)據(jù)不會(huì)被第三方應(yīng)用修改
    2、數(shù)據(jù)大小在可接受的范圍之內(nèi)
    3、數(shù)據(jù)更新頻率較低
    4、同一數(shù)據(jù)可能會(huì)被系統(tǒng)頻繁引用
    5、非關(guān)鍵數(shù)據(jù)(關(guān)鍵數(shù)據(jù),如金融賬戶數(shù)據(jù))
    Hibernate本身并未提供二級緩存的產(chǎn)品化實(shí)現(xiàn)(只是提供了一個(gè)基于Hashtable的簡單緩存以供調(diào)試),而是為眾多的第三方緩存組件提供了接入接口,我們可以根據(jù)實(shí)際情況選擇不同的緩存實(shí)現(xiàn)版本。

       
    posted @ 2009-12-22 15:01 王永慶 閱讀(227) | 評論 (0)編輯 收藏
    <2009年12月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    關(guān)注blogs

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 四虎成人精品永久免费AV| 四虎成人精品一区二区免费网站 | 日日摸日日碰夜夜爽亚洲| 亚洲国产精品无码专区| 国产免费观看黄AV片| 日韩在线视频免费| 亚洲国产a级视频| 十八禁视频在线观看免费无码无遮挡骂过| 久久久久国产亚洲AV麻豆| 最近中文字幕mv手机免费高清| 亚洲AV日韩AV永久无码色欲| 亚洲国产婷婷香蕉久久久久久| 国内免费高清在线观看| 一区二区三区免费高清视频| 亚洲日韩亚洲另类激情文学| 亚洲国产精品尤物yw在线| 四虎成人精品一区二区免费网站| 日韩版码免费福利视频| 一个人免费播放在线视频看片| 亚洲国产精品日韩av不卡在线| 亚洲尤码不卡AV麻豆| 精品久久久久成人码免费动漫 | 又爽又高潮的BB视频免费看| 美女网站在线观看视频免费的 | 国产成人免费福利网站| 成人免费视频软件网站| 精品熟女少妇AV免费观看| 4hu四虎最新免费地址| 18女人毛片水真多免费| 99蜜桃在线观看免费视频网站| 国产在线观看免费视频软件| 国产免费一级高清淫曰本片| 国产精品免费观看视频| 色爽黄1000部免费软件下载| 无码免费又爽又高潮喷水的视频| 免费人成网站永久| 亚洲AV无码精品蜜桃| 亚洲一区二区三区高清视频| 亚洲人成www在线播放| 亚洲成a人无码亚洲成www牛牛 | 成人免费在线视频|