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

Hibernate 動態切換 Schema 方案:重建 SessionFactory 實現多租戶資料隔離

     編輯:J2EE

場景

Oracle 多用戶/Schema 架構下,同一套 POJO 映射需在運行時切換目標 Schema (如 `POI_BEIJING` → `POI_SHANGHAI`),實現邏輯庫隔離。

映射文件調整

移除 `.hbm.xml` 中的 schema 屬性,改由運行時指定:

<class name="com.csc.poimanager.dao.Poi" table="POI">  <!-- 移除 schema="P_BEIJING" -->
  ...
</class>

預設 Schema 配置

<property name="hibernate.default_schema">POI_BEIJING</property>

動態切換核心代碼

public static void rebuildSessionFactoryForChangeSchema(String newSchema) {
    try {
        Properties props = configuration.getProperties();
        props.put("hibernate.default_schema", newSchema);
        sessionFactory = configuration.buildSessionFactory();  // 重建工廠
        System.out.println("Schema 切換成功:" + newSchema);
    } catch (Exception e) {
        System.err.println("SessionFactory 重建失敗");
        e.printStackTrace();
    }
}

使用範例

HibernateSessionFactory.rebuildSessionFactoryForChangeSchema("POI_SHANGHAI");
PoiDAO dao = new PoiDAO();
Transaction tx = dao.getSession().beginTransaction();
dao.save(new Poi("JSfjksdf"));
tx.commit();  // 實際寫入 POI_SHANGHAI.POI 表

⚠️ 重大限制與改進方向

  • 全域生效:靜態 SessionFactory 重建影響所有使用者/執行緒,非線程安全,高併發下極危險。
  • 性能殺手:重建工廠需重新解析映射、重建連線池,極其耗時。

生產級替代方案

  1. 多 SessionFactory 快取:以 Schema 名為 Key 預建/懶建多個 SessionFactory 實例,ThreadLocal 綁定當前租戶 Schema。
  2. Hibernate 4+ Multi-tenancy:原生支援 SCHEMA / DATABASE / DISCRIMINATOR 三種策略,配合 CurrentTenantIdentifierResolver 實現零侵入切換。
  3. 分庫路由中間件:ShardingSphere、MyCat 等代理層攔截 SQL 自動改寫 Schema/Table 名。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved