<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Hibernate 4 的多租戶 > 原文: [https://javabeginnerstutorial.com/hibernate/multi-tenancy-with-hibernate-4/](https://javabeginnerstutorial.com/hibernate/multi-tenancy-with-hibernate-4/) 多租戶表示軟件開發中的一種方法,其中單個應用同時為多個客戶端提供服務。 這些客戶也稱為租戶。 這種方法在軟件即服務(SaaS)解決方案中非常普遍。 這種系統面臨的挑戰是租戶之間的數據隔離:每個客戶只能看到其信息,而不能訪問其他客戶的信息。 ## 多租戶方法 在客戶端之間隔離數據的主要方法有 3 種: * 單獨的數據庫 * 單獨的模式 * 分區數據 即使您從名稱中就知道了這個主意,也讓我們來看看它們。 ### 單獨的數據庫 在這種情況下,每個租戶的數據都保存在物理上分開的數據庫中。 這樣可以確保應用只能訪問此數據庫,從而確保完整性。 此解決方案的一種方法是為每個租戶建立一個數據庫連接池,并根據與當前登錄用戶相關聯的租戶標識符來選擇該池。 ### 單獨的模式 采用這種方法,我們只有一個數據庫,但是客戶的數據存儲在單獨的數據庫模式中。 對于這種方法,主要有兩個解決方案可以實現此目的: 第一種解決方案與以前的方法類似:為每個架構創建連接池,并根據當前用戶的租戶標識符選擇連接池。 第二種解決方案將使用默認模式指向數據庫本身,并使用`SET SCHEMA` SQL 命令(或類似的如果數據庫允許的話)對每個連接更改數據庫模式。 在這種情況下,單個連接池將為所有租戶提供服務,但是在使用此連接之前,它將使用用戶的租戶標識符將其更改為正確的架構。 ### 分區數據 通過這種方法,所有數據都保存在單個數據庫模式中。 租戶之間的數據由一個區分值劃分,該區分值的范圍從單列到復雜的 SQL 公式。 使用這種方法,將再次有一個連接池,但是這次必須更改每個 SQL 查詢以引用租戶的鑒別值。 ## 多租戶和 Hibernate 要與 Hibernate 建立多租戶連接,您必須從會話開始: ```java Session session = sessionFactory.withOptions().tenantIdentifier( yourTenantIdentifier ).openSession(); ``` 如您所見,在打開會話時,您需要提供租戶標識符。 在這種情況下,您還必須提供一個`MultiTenancyStrategy`,以讓 Hibernate 知道要在數據庫中尋找哪種策略(或者如果您啟用了 Hibernate 的模式管理,則可以創建該策略): * `NONE`:這是默認設置,如果您使用`tenantIdentifier`打開會話,則會引發異常 * 模式 * 數據庫 * 判別器:Hibernate 計劃從版本 **5** 開始支持此策略。 如果您沒有為`NONE`以外的其他策略提供租戶標識符,則會出現異常。 當使用`NONE`以外的策略時,必須指定一個`MultiTenantConnectionProvider`。 可以在您的 Hibernate 配置中使用`hibernate.multiTenancy`設置來設置這些策略(在本例中為`hibernate.cfg.xml`文件)。 ### `MultiTenantConnectionProvider` 要使用兩個可用的多租戶供應器之一,我們需要配置`MultiTenantConnectionProvider`。在這種特殊情況下,這意味著我們必須自己實現。 在本文的示例應用中,我添加了接口的最基本的實現。 是的,有兩種實現方式,因為`SCHEMA`和`DATABASE`策略需要單獨處理。 `MultiTenantConnectionProviderImpl`類用于`DATABASE`策略。 `MultiTenantConnectionProviderWithDbPoolImpl`類用于`SCHEMA`策略。 `DatabasePool`實現的唯一問題是它使用 H2 數據庫,而 H2 不知道`USE` SQL 命令,因此在嘗試運行應用時遇到異常。 ## 關于租戶 ID 的評論 如果您使用的是數據庫,請使用字符串作為租戶 ID(除非您使用`DISCRIMINATOR`策略),因為架構必須具有文本名稱,并且如果您提供數字(即使在`CurrentTenantIdentifierResolverImpl`中作為字符串),也會出現數據庫異常。 ## 模式更新 當您在數據庫中使用多租戶時,無法選擇 Hibernate 模式。 這是因為它只會在啟動應用時更新默認架構-如果切換到另一個架構,則可能不會更新。 這意味著您必須手動創建要使用的架構,并將必需的表添加到這些架構。 或者,可以使用 Liquibase 或 FlyWay 之類的遷移工具來提供幫助。 下面的腳本顯示了如何創建模式及其中的`BOOKS`表。 如果不存在則創建模式示例; 使用示例; ```java create table Books ( id bigint generated by default as identity (start with 1), title varchar(255), isbn varchar(255), authors varchar(255), published_date date(8), primary key (id) ); ``` ## 總結 我們已經看到在我們的應用中實現多租戶并不是不可能的,但是當前它需要一些編碼才能在租戶之間建立正確的連接池和映射,并且您必須照顧好數據庫,模式和表。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看