2008-09-23 104 views
8

我已經給出了一個需求,我需要在同一個實例中支持多個數據庫,以支持多租戶。每個數據庫具有相同的模式。用戶通過從列表中選擇來登錄到特定數據庫,並且所有後續調用都將轉到該數據庫,直到他們註銷。Spring/Hibernate下的多個會話工廠

我想根據客戶端提供的參數在單個HibernateDaoTemplate內熱插拔會話工廠。

我可以在熱交換數據源(以及與之相關的所有事務問題)上找到很多東西,但我想熱交換會話工廠 - 爲每個工廠保留所有緩存。

這樣做最簡單的方法是什麼?爲DaoTemplate配置HotSwappableTarget?任何人都可以指點我如何做到這一點?

回答

2

如果所有數據庫都是相同的,那麼我可以建議使用一個SessionFactory併爲DataSource和Cache提供您自己的實現,這些實現實際上是「承載感知」的。 (實現這些相當簡單:只需維護租戶id的映射 - >真實緩存/真實數據源,然後將所有調用委託給相應的應用)。配置單個SessionFactory以使用您的租戶感知緩存和數據源。 ThreadLocal可用於使當前請求的租戶ID可用於任何需要了解它的代碼。

我成功地使用這種方法來支持多租戶。

+0

好主意 - 但您如何切換承租人感知緩存?你所能做的只是配置一個緩存提供程序,而hibernate使用它來創建一個緩存。也許實現一個CacheProvider,然後生成一個承租人感知緩存包裝? – Verdant 2008-09-24 10:08:43

0

你也可以看看Hibernate的碎片項目:

http://www.hibernate.org/414.html

...其重點是增加對水平分區到Hibernate的核心支持。它還沒有涵蓋完整的Hibernate API,但確實支持它的很大一部分(這可能或可能不足以滿足您的需求)。當然,他們正在努力實現全面覆蓋。

2

我在哪裏工作過,我們通過ThreadLocal完成了以下操作this guide.我們只使用了一個SessionFactory,並根據用戶在登錄時可能更改的會話變量交換了它的數據源。我不記得確切的詳細信息,但是如果您我有興趣瞭解更多關於實施的信息。

雖然這麼說,我以前的工作場所的人現在正在擺脫這種方法,走向分片數據庫。絕對是一個更優雅的解決方案,我建議你看看。

1

延伸遠離的HibernateDaoSupport的DAO類,然後調用的setSessionFactory()方法,做數據庫

0

我也通過ThreadLocal的嘗試緩存提供商和困難的部分是做高速緩存上的熱交換的熱交換,您必須確保SessionFactory沒有任何與之關聯的活動會話。現在,我認爲有一個更好的解決方案:通過使用Spring 3 java配置,您可以動態創建感知租戶的SessionFactory,並讓Spring爲您執行緩存管理。