首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 緩存機制與原生 SQL 完整指南

     編輯:Java 相關知識

Hibernate 多級緩存架構

Hibernate 採用三級緩存策略,由內而外逐級生效:

  1. 一級緩存(Session 級):強制啟用,生命周期與 Session 綁定。同一 Session 內重複查詢同一實體直接命中緩存;事務提交前批量刷新,減少 UPDATE 語句。
  2. 二級緩存(SessionFactory 級):可選,跨 Session 共享。需配置緩存提供者(如 EhCache)並為實體類啟用 <cache usage="read-write"/>。適合「讀多寫少、非關鍵數據」。
  3. 查詢緩存:緩存 HQL/SQL 查詢結果集(僅存 ID),依賴二級緩存解析實體。需在配置中開啟 hibernate.cache.use_query_cache=true 並在 Query 上調用 setCacheable(true)。

二級緩存配置實戰(以 EhCache 為例)

1. 實體映射文件啟用緩存

<class name="Employee" table="EMPLOYEE">
    <cache usage="read-write"/>
    <id name="id" column="id"><generator class="native"/></id>
    <property name="firstName" column="first_name"/>
    ...
</class>

2. hibernate.cfg.xml 指定提供者

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

3. ehcache.xml 定義緩存區域屬性

<cache name="Employee" 
       maxElementsInMemory="500" 
       eternal="true" 
       timeToIdleSeconds="0" 
       timeToLiveSeconds="0" 
       overflowToDisk="false"/>

並發策略選型指南

策略適用場景
Transactional嚴格事務環境,極少更新,需絕對一致性
Read-write讀多寫少,允許極短暫髒讀(默認推薦)
Nonstrict-read-write極少更新,容忍短暫不一致,性能最優
Read-only只讀參考數據(如字典表),性能最佳

原生 SQL 查詢詳解

當 HQL 無法表達複雜查詢(如 Oracle CONNECT BY、分頁優化 Hint)時,可使用 session.createSQLQuery(sql)。

三種查詢模式

// 1. 標量查詢:返回 List>
String sql = "SELECT first_name, salary FROM EMPLOYEE";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();

// 2. 實體查詢:返回 List
String sql = "SELECT * FROM EMPLOYEE";
query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
List emps = query.list();

// 3. 命名參數查詢
String sql = "SELECT * FROM EMPLOYEE WHERE id = :id";
query = session.createSQLQuery(sql);
query.addEntity(Employee.class);
query.setParameter("id", 10);
List emps = query.list();

完整可運行範例結構

文中提供完整的 Employee 實體、建表 SQL、映射文件、配置文件及 ManageEmployee 主程式,涵蓋保存、標量查詢、實體查詢全流程,可直接部署驗證。

性能調優建議

  • 二級緩存不宜濫用:先基準測試,確認命中率提升後再啟用。
  • 查詢緩存僅適用於參數固定、高頻執行的查詢。
  • 大批量寫入時使用 StatelessSession 繞過緩存,或定期 session.flush()/clear() 防止 OOM。
  • 原生 SQL 破壞可移植性,建議隔離在 DAO 層並添加註釋說明。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved