效能最佳化是一個很大的話題,大到程式架構最佳化,資料庫設計等,小到一個特定演算法,甚至js最佳化等等。這裡我們只簡單談一下hibernate的效能最佳化。
在使用Hibernate的時候,通過正確的方法和策略,可以提高執行效率。
(一)抓取策略
抓取策略(fetching strategy)是指:當應用程式需要在(Hibernate實體物件圖的)關聯關係間進行導航的時候, Hibernate如何擷取關聯對象的策略。抓取策略可以在O/R映射的中繼資料中聲明,也可以在特定的HQL 或條件查詢(Criteria Query)中重載聲明。
例如單端代理,集合代理,批量抓取等
設定方式通常為
*fetch="join",hibernate會通過一個select語句串連(內聯/外聯)抓取其關聯對象或集合
*fetch="subselect",另外發送一條select語句抓取在前面查詢到的所有實體的關聯集合
*可以使用fetch預抓取Classes,解決N+1問題,hql中使用“join fetch ” ,select s from Student s join fetch s.classes where s.id in(:ids)
*batch-size屬性,可以批量載入實體類
(二)緩衝
緩衝原則:通常讀遠遠大於寫的資料進行緩衝
Hibernate的Session在事務層級進行持久化資料的快取作業。 當然,也有可能分別為每個類(或集合),配置叢集、或JVM層級(SessionFactory層級)的緩衝。 你甚至可以為之插入一個叢集的緩衝。注意,緩衝永遠不知道其他應用程式對持久化倉庫(資料庫)可能進行的修改 (即使可以將快取資料設定為定期失效)。
1、一級緩衝
一級緩衝生命週期很短和session的生命週期一致,一級緩衝也叫session級的緩衝或事務級緩衝
* load/get/iterate查詢實體物件時,支援一級緩衝
* 一級緩衝是緩衝實體對像的,對屬性不緩衝
*對於 大批量的資料添加
session.beginTransaction();
for (int i=0; i<100000; i++) {
Student student = new Student();
student.setName("張三" + i);
session.save(student);
//每20條更新一次
if (i % 20 == 0) {
session.flush();
//清除緩衝的內容
session.clear();
}
}
session.getTransaction().commit();