hibernate的二級快取和資料池的配置
hibernate對連線池的支援
連線池,
作用: 管理連線;提升連線的利用效率!
常用的連線池: C3P0連線池
Hibernate自帶的也有一個連線池,且對C3P0連線池也有支援!
Hbm 自帶連線池:
只維護一個連線,比較簡陋。
可以檢視hibernate.properties檔案檢視連線池詳細配置:
#################################
### Hibernate Connection Pool ###
#################################
hibernate.connection.pool_size 1 【Hbm 自帶連線池: 只有一個連線】
###########################
### C3P0 Connection Pool### 【Hbm對C3P0連線池支援】
###########################
#hibernate.c3p0.max_size 2 最大連線數
#hibernate.c3p0.min_size 2 最小連線數
#hibernate.c3p0.timeout 5000 超時時間
#hibernate.c3p0.max_statements 100 最大執行的命令的個數
#hibernate.c3p0.idle_test_period 3000 空閒測試時間
#hibernate.c3p0.acquire_increment 2 連線不夠用的時候, 每次增加的連線數
#hibernate.c3p0.validate false
【Hbm對C3P0連線池支援, 核心類】
告訴hib使用的是哪一個連線池技術。
#hibernate.connection.provider_classorg.hibernate.connection.C3P0ConnectionProvider
Hibernate.cfg.xml 中增加連線池相關配置:
<!-- 【連線池配置】 --> <!-- 配置連線驅動管理類 --> <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <!-- 配置連線池引數資訊 --> <property name="hibernate.c3p0.min_size">2</property> <property name="hibernate.c3p0.max_size">4</property> <property name="hibernate.c3p0.timeout">5000</property> <property name="hibernate.c3p0.max_statements">10</property> <property name="hibernate.c3p0.idle_test_period">30000</property> <property name="hibernate.c3p0.acquire_increment">2</property> |
三、二級快取
Hibernate提供的快取
有一級快取、二級快取。 目的是為了減少對資料庫的訪問次數,提升程式執行效率!
一級快取:
基於Session的快取,快取內容只在當前session有效,session關閉,快取內容失效!
特點:
作用範圍較小! 快取的事件短。
快取效果不明顯。
概述
二級快取:
Hibernate提供了基於應用程式級別的快取, 可以跨多個session,即不同的session都可以訪問快取資料。 這個換存也叫二級快取。
Hibernate提供的二級快取有預設的實現,且是一種可插配的快取框架!如果使用者想用二級快取,只需要在hibernate.cfg.xml中配置即可;不想用,直接移除,不影響程式碼。
如果使用者覺得hibernate提供的框架框架不好用,自己可以換其他的快取框架或自己實現快取框架都可以。
使用二級快取
檢視hibernate.properties配置檔案,二級快取如何配置?
##########################
### Second-level Cache ###
##########################
#hibernate.cache.use_second_level_cachefalse【二級快取預設不開啟,需要手動開啟】
#hibernate.cache.use_query_cache true 【開啟查詢快取】
## choose a cache implementation 【二級快取框架的實現】
#hibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider
#hibernate.cache.provider_classorg.hibernate.cache.EmptyCacheProvider
hibernate.cache.provider_classorg.hibernate.cache.HashtableCacheProvider 預設實現
#hibernate.cache.provider_classorg.hibernate.cache.TreeCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
#hibernate.cache.provider_classorg.hibernate.cache.SwarmCacheProvider
二級快取,使用步驟
1) 開啟二級快取
2)指定快取框架
3)指定那些類加入二級快取
4)測試
測試二級快取!
快取策略
<class-cacheusage="read-only"/> 放入二級快取的物件,只讀;
<class-cacheusage="nonstrict-read-write"/> 非嚴格的讀寫
<class-cacheusage="read-write"/> 讀寫; 放入二級快取的物件可以讀、寫;
<class-cacheusage="transactional"/> (基於事務的策略)
集合快取
<!-- 集合快取[集合快取的元素物件,也加加入二級快取] -->
<collection-cache
usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>
查詢快取
list() 預設情況只會放入快取,不會從一級快取中取!
使用查詢快取,可以讓list()查詢從二級快取中取!
完整案例:
Hibernate.cfg.xml |
<!--****************** 【二級快取配置】****************** --> <!-- a. 開啟二級快取 --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- b. 指定使用哪一個快取框架(預設提供的) --> <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> <!-- 開啟查詢快取 --> <property name="hibernate.cache.use_query_cache">true</property> <!-- c. 指定哪一些類,需要加入二級快取 --> <class-cache usage="read-write" class="cn.itcast.b_second_cache.Dept"/> <class-cache usage="read-only" class="cn.itcast.b_second_cache.Employee"/> <!-- 集合快取[集合快取的元素物件,也加加入二級快取] --> <collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>
|
App 測試類 |
publicclass App {
privatestatic SessionFactory sf; static { sf = new Configuration() .configure() .addClass(Dept.class) .addClass(Employee.class) // 測試時候使用 .buildSessionFactory(); } // 1. 測試二級快取的使用 // 沒有/有用二級快取 @Test publicvoid testCache() { Session session1 = sf.openSession(); session1.beginTransaction(); // a. 查詢一次 Dept dept = (Dept) session1.get(Dept.class, 10); dept.getEmps().size();// 集合 session1.getTransaction().commit(); session1.close();
System.out.println("------");
// 第二個session Session session2 = sf.openSession(); session2.beginTransaction(); // a. 查詢一次 dept = (Dept) session2.get(Dept.class, 10); // 二級快取配置好;這裡不查詢資料庫 dept.getEmps().size();
session2.getTransaction().commit(); session2.close(); }
@Test publicvoid listCache() { Session session1 = sf.openSession(); session1.beginTransaction(); // HQL查詢 【setCacheable 指定從二級快取找,或者是放入二級快取】 Query q = session1.createQuery("from Dept").setCacheable(true); System.out.println(q.list()); session1.getTransaction().commit(); session1.close();
Session session2 = sf.openSession(); session2.beginTransaction(); q = session2.createQuery("from Dept").setCacheable(true); System.out.println(q.list()); // 不查詢資料庫:需要開啟查詢快取 session2.getTransaction().commit(); session2.close(); } }
|