標籤:開啟 預設 讀取 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--緩衝