hibernate12--緩衝

來源:互聯網
上載者:User

標籤:開啟   預設   讀取   password   normal   sig   技術分享   job   唯讀   

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory>    <property name="connection.url">        jdbc:oracle:thin:@localhost:1521:orcl    </property>    <property name="connection.username">t10</property>    <property name="connection.password">t10</property>    <property name="connection.driver_class">        oracle.jdbc.OracleDriver    </property>    <!--方言  -->    <property name="dialect">        org.hibernate.dialect.Oracle9Dialect    </property>    <property name="show_sql">true</property>    <property name="hbm2ddl.auto">update</property>    <!-- 在我們的項目中使用currentSession-->    <property name="current_session_context_class">thread</property>    <!-- 開啟配置2級緩衝 -->    <property name="cache.use_second_level_cache">true</property>    <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>     <!-- 開啟查詢快取 -->    <property name="cache.use_query_cache">true</property>    <!--載入我們配置的對應檔  全路徑 -->    <mapping resource="cn/bdqn/bean/Dept.hbm.xml" />    <mapping resource="cn/bdqn/bean/Emp.hbm.xml" /></session-factory></hibernate-configuration>

 

 

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.bdqn.bean">  <class name="Emp">  <!-- 配置2級緩衝策略 -->    <cache usage="read-only"/>         <id name="empNo">           <generator class="assigned"/><!-- 手動給主鍵賦值 -->       </id>         <property name="empName"/>       <property name="job"/>       <property name="sal" column="salary"/>       <property name="hireDate"/>       <!-- 配置多對一關聯       name:對應的是  本類中 關聯關係的屬性名稱       column:對應資料庫中 兩個表的  外鍵!       class:關聯的實體類       -->       <many-to-one  name="dept" column="DEPTNO" class="Dept"/>   </class></hibernate-mapping>

 

<ehcache><!-- java.io.tmpdir:臨時系統檔案!  可以換成自己建立的目錄下 -->    <diskStore path="java.io.tmpdir"/>    <!--  maxElementsInMemory:在記憶體中 最大的儲存量  10000對象  eternal:是否永遠不銷毀  timeToIdleSeconds:當前緩衝的資料閑置多少時間被銷毀  以秒為單位  timeToLiveSeconds:當前緩衝的資料超過多少時間被銷毀 以秒為單位  overflowToDisk: 是否寫入磁碟  diskPersistent:硬碟檔案是否永久儲存  memoryStoreEvictionPolicy:  緩衝清理策略:         FIFO ,first in first out (先進先出).                 LFU , Less Frequently Used (最少使用).        意思是一直以來最少被使用的。緩衝的元素有一個hit 屬性,hit 值最小的將會被清出緩衝。                LRU ,Least Recently Used(最近最少使用).         (ehcache 預設值).緩衝的元素有一個時間戳記,當緩衝容量滿了,        而又需要騰出地方來緩衝新的元素的時候,那麼現有緩衝元素中時間戳記離目前時間最遠的元素將被清出緩衝。    -->    <defaultCache            maxElementsInMemory="10000"            eternal="false"            timeToIdleSeconds="120"            timeToLiveSeconds="120"            overflowToDisk="true"            memoryStoreEvictionPolicy="LRU"            /></ehcache>

 

 

package cn.bdqn.test;import java.util.ArrayList;import java.util.List;import oracle.net.aso.s;import org.hibernate.CacheMode;import org.hibernate.Criteria;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.DetachedCriteria;import org.hibernate.criterion.MatchMode;import org.hibernate.criterion.Order;import org.hibernate.criterion.Projections;import org.hibernate.criterion.Property;import org.hibernate.criterion.Restrictions;import org.hibernate.transform.Transformers;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.sun.org.apache.xml.internal.security.encryption.Transforms;import cn.bdqn.bean.Dept;import cn.bdqn.bean.Emp;import cn.bdqn.util.HibernateUtil;public class EmpTest {        /**     * 1級緩衝:  session中的緩衝     *  clear():清空session中所有的緩衝對象     *  evict():清除session中指定的對象     */        @Test    public   void  test01(){        Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();        Emp emp = (Emp) session.get(Emp.class, 1); // 產生1條sql        session.clear();  //清空緩衝        emp = (Emp) session.get(Emp.class, 1);  //產生1條sql    }    @Test    public   void  test02(){        Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();        Emp emp = (Emp) session.load(Emp.class, 1);         session.clear();  //清空緩衝        emp = (Emp) session.load(Emp.class, 1);      }        @Test    public   void  test03(){        Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();        Emp emp1 = (Emp) session.get(Emp.class, 1); //產生1條sql        Emp emp2 = (Emp) session.get(Emp.class, 2); //產生1條sql        session.evict(emp1);  //清除指定的    }        @Test    public   void  test04(){        Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();           Emp emp=new Emp();           emp.setEmpNo(51);           emp.setEmpName("haha");           session.save(emp);           session.evict(emp);  //清除指定的           transaction.commit(); // 能儲存到資料庫中嗎? 肯定不能儲存  除非把 session.evict(emp); 去掉    }        @Test    public   void  test05(){        Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();        Emp emp=new Emp();        emp.setEmpNo(52);        emp.setEmpName("haha");        session.save(emp);  //持久態        System.out.println("********");        session.flush();   //產生sql語句  把 emp對象 同步到 資料庫        System.out.println("********");        session.evict(emp);  //清除指定的   但是 已經  清理了 緩衝        transaction.commit(); // 能儲存到資料庫中,因為已經flush    }            @Test    public   void  test06(){        Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();        Emp emp=(Emp) session.get(Emp.class, 1);  //持久化        emp.setEmpName("haha");   //emp 髒對象        System.out.println("flush前******************");        session.flush();  //同步資料庫        System.out.println("flush後******************");        emp=(Emp) session.get(Emp.class, 1);  //持久化        System.out.println(emp.getEmpName());  //輸出 haha   證明同步到資料庫中了        emp.setEmpName("heihei");   //emp 髒對象        transaction.commit();    }                /**     * 2級緩衝:  進程或者是叢集範圍內的緩衝!是sessionFactory的緩衝!     * 一個sessionFactory可以建立N個session!     * 也就是說 在2級緩衝中的資料,N個session共用!     *      *      * 2級緩衝適合存放的資料:     * 01.不經常被修改的資料     * 02.不敏感的資料  (財務資料不能放入)     * 03.共用的資料       *      *      * 配置ehCache緩衝     * 01.引入jar     * 02.找到對應xml檔案     * 03.在hibernate.cfg.xml檔案中  開啟和配置緩衝     * 04.在對應的對應檔中  配置  緩衝的策略     */            @Test    public   void  test07(){  //之前是 兩條sql語句        Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();        Emp emp = (Emp) session.get(Emp.class, 1); // 產生1條sql        session.clear();  //清空緩衝        emp = (Emp) session.get(Emp.class, 1);     }        /**     * 驗證我們  對應檔中的    <cache usage="read-only"/>     */    @Test    public   void  test08(){          Session session = HibernateUtil.getCurrentSession();        Transaction transaction = session.beginTransaction();        Emp emp = (Emp) session.get(Emp.class, 1); // 產生1條sql        emp.setEmpName("hahaahaha");        session.update(emp);        transaction.commit();  //報錯   can‘t  writer  to readonly  object!!    }                    //java.io.tmpdir:臨時系統檔案!  可以換成自己建立的目錄下    @Test    public  void  test09(){        System.out.println(System.getProperty("java.io.tmpdir"));    }            /**     * 設定2級緩衝 模式     * CacheMode.IGNORE: 不與2級緩衝關聯                                產生2條sql     * CacheMode.NORMAL:與2級緩衝關聯,可讀可寫                   產生1條sql     * CacheMode.GET:與2級緩衝關聯,唯讀                                  產生1條sql     * CacheMode.PUT:與2級緩衝關聯,唯寫                                  產生2條sql     * CacheMode.REFRESH:與2級緩衝關聯,唯寫       * 通過 hibernate.cache.use_minimal_puts 的設定,強制二級緩衝從資料庫中讀取資料,重新整理緩衝內容。     *                     產生2條sql     */    @Test    public  void  test10(){     Session session = HibernateUtil.getCurrentSession();     Transaction transaction = session.beginTransaction();        Emp emp = (Emp) session.get(Emp.class, 1); // 產生1條sql        session.clear();        //設定緩衝模式        session.setCacheMode(CacheMode.REFRESH);        emp = (Emp) session.get(Emp.class, 1);                     }                /*     * 查詢快取     *   基於2級緩衝!       *   第一次在網頁中查詢一個關鍵字 為 java的所有 頁面 可能需要等待 2S     *   第2次在網頁中查詢一個關鍵字 為 java的所有 頁面   必須 小於2S     *        *   01.去核心設定檔中配置     *   <property name="cache.use_query_cache">true</property>     *   02.手動開啟查詢快取     *   query.setCacheable(true);     */            @Test    public void test11(){        Session session = HibernateUtil.getCurrentSession();         Query query = session.createQuery("from Dept");         query.setCacheable(true); //首次開啟 ! 之後如果還是這個query語句,那麼就會啟動查詢快取         List list = query.list();         for (Object object : list) {            System.out.println(object);        }         System.out.println("****************************");         Query query2 = session.createQuery("from Dept");         query2.setCacheable(true);  //先去 查詢快取中尋找         List list2 = query2.list();         for (Object object : list2) {            System.out.println(object);        }         System.out.println("****************************");         Query query3 = session.createQuery("from Dept");         //query3.setCacheable(true);         List list3 = query3.list();         for (Object object : list3) {             System.out.println(object);         }         session.close();             } }

hibernate12--緩衝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.