<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">false</prop> <!-- 生產關閉 -->
<prop key="hibernate.jdbc.batch_size">50</prop> <!-- 批次 DML -->
<prop key="hibernate.order_inserts">true</prop>
<prop key="hibernate.order_updates">true</prop>
<prop key="hibernate.jdbc.fetch_size">100</prop> <-- 結果集預取 -->
<prop key="hibernate.generate_statistics">false</prop>
</props>
</property>
關鍵參數說明:
batch_size:INSERT/UPDATE/DELETE 批次執行,減少網絡往返 (建議 20-100)fetch_size:JDBC 層面結果集預取筆數,大結果集查詢顯著提速order_inserts/updates:同類實體排序批次,提升批次命中率| 方法 | 行為 | 適用場景 | 風險 |
|---|---|---|---|
list() | 一次性載入所有實體至 Session 快取 | 小結果集 (<1000) | 大結果集 OOM、GC 壓力大 |
iterate() | 先查 ID,再逐筆載入 (N+1 查詢) | 結果集大但含重複/僅需部分存取 | 無重複時極慢,N 次資料庫往返 |
scroll() | 資料庫游標流式處理 | 百萬級報表/ETL | 需手動管理游標關閉,長事務風險 |
lazy=true,按需載入@BatchSize(size=20) 或 <set batch-size="20">
/* 投影查詢:只選需要的欄位,不進快取 */
List
session.save() 循環 + 定期 flush()/clear() (每 50 筆)StatelessSession 繞過快取,適合大量匯入IDENTITY (資料庫自增) 或 SEQUENCE (Oracle/PostgreSQL),避免 TABLE (效能差)@Version 避免長事務悲觀鎖show_sql、generate_statistics 監控sessionFactory.getStatistics() 獲取命中率、查詢執行時間記住:過早優化是萬惡之源,先用監控找到真正瓶頸,再針對性優化。