2017-07-31 103 views
0

我有多個基於客戶ID分片的MySQL數據庫。有一個微服務提供關於分片信息的細節(哪個客戶id屬於哪個db等)。Spring - 休眠 - 動態配置多個數據庫

到目前爲止,我的代碼以單一數據源的工作,我提供了一個SessionFactory的Hibernate配置文件的一部分功能:

@Bean 
public DataSource dataSource() { 
} 

我:

@Bean 
public LocalSessionFactoryBean sessionFactory() { 
    // set data source here 
} 

數據源是由歸國am自動裝配DAO中的sessionFactory:

@Autowired 
private SessionFactory sessionFactory; 

現在,使用多個d atasource,我需要:

  • 讀取配置的數據庫,從微服務
  • 使用DB的列表來創建數據源動態
  • SessionFactory的,應根據顧客的ID動態裝箱。

我不確定如何自動裝配sessionFactory,以便根據客戶ID初始化數據源。

這裏的任何幫助真的很感激。

+0

什麼是動態的。 Spring在應用程序啓動時配置bean,所以不能注入第二個數據源。如果您指定其他彈簧作用域,則動態創建SessionFactory將無法很好地擴展。這些對象必須在啓動時創建。 –

+0

您可以使用限定符配置單獨的bean,並且其中一個可以是主要的,您在第一次請求時需要它。 –

+0

有關數據庫的信息不是靜態的。該信息由另一個微服務提供,該服務列出了所有已配置的分片數據庫。可以在管理它的微服務處添加或刪除數據庫。 說,如果我需要添加一個新的客戶ID,對應於該ID的所有數據將被添加爲一個單獨的數據庫實例,然後微服務將返回一個數組與新添加的數據庫。 – agarwalankur85

回答

0

恥辱我沒有看到這個問題之前現在。使用hibernate 4+做到這一點的最簡單方法是將您的分片設置爲數據源。我個人使用容器管理的數據源,但是你可以用另一種方式來實現,難以建立和維護自己的連接池。這些數據源具有與它們相關的jndi名稱,允許您從休眠連接提供程序訪問連接池。如果以這種方式完成,每個事務只能寫入一個分片,當然,您可以只寫入多個數據源,只有一個分片。請注意將所有關聯的關係數據放在同一個模式中的同一個分片上。這一點很重要。您可以利用應用程序服務器事務註冊表來連接跨緩存提供程序和所有數據源的JTA事務訪問。請記住在每個事務中對所有數據源使用XA。利用hibernate多租戶來提供使用哪個模式的方向。 (也傳遞給具有threadlocal並分配給該數據源的連接的連接提供者)。您將需要密切關注equals和hash方法,因爲邏輯上想要相等的多個對象可能同時附加到不同的類加載器,並且在默認情況下實際上並不相同。當這樣的事件發生時,當這些對象包含在事務中時,你會得到一些非常奇怪的hibernate錯誤消息,並且試圖持久化它們。覆蓋一切。