2010-10-04 62 views
16

我在寫一個支持多用戶的web應用程序。每個用戶都有自己的數據庫 - 使用H2。所有的數據庫模式都是一樣的。多用戶數據源 - Spring +休眠

我希望在這個應用程序中使用Spring + Hibernate。

所以我停留在如何將用戶的數據庫與該用戶聯繫起來 - 春天的AbstractRoutingDataSource也許在HttpSession相關的它,並延長?但不會影響Hibernate的緩存嗎?另一種方法是爲每個數據源分配一個SessionFactory,儘管每個數據源的模式都是一樣的......所以我認爲這是浪費。

不管怎麼說選擇數據源需要是動態的 - 在上下文中的文件不能被預先配置,爲每個新用戶將擁有自己的數據庫中創建。有沒有現有的框架/解決方案?

我不太瞭解Hibernate Shards,也許這有效?

回答

8

可能是錯的(嚴格)需要有每個數據庫都有一個SessionFactory,所建議的一些資源:

我會花一些時間來重新閱讀一切明天(我沒有得到所有細節要誠實),並完全理解這種設置的影響(儘管它似乎很清楚它會打破二級緩存)。我稍後再回來。


我正在寫一個支持多用戶的網絡應用程序。每個用戶都有自己的數據庫 - 使用H2。所有的數據庫模式都是一樣的。

我想知道這將如何擴展......你有多少用戶?你如何運行H2,是什麼模式?

因此,我被困在如何將用戶的數據庫與該用戶相關聯 - 可能與HTTPSession相關聯,並擴展了Spring的AbstractRoutingDataSource?

你必須建立一個SessionFactory每個用戶和它關聯到登錄的用戶(在Map,使用登錄爲重點),然後獲得一個給定的SessionFactory一個Session。將SessionFactory的生命週期綁定到HTTP會話似乎是個好主意(以節省一些內存),但我不確定Spring在這裏會非常有幫助。我可能是錯誤的,但是HibernateUtil類的變體,完全程序化的方法看起來更容易。順便說一下,我不確定你需要每個用戶有多個連接。

但不會這種效果Hibernate的緩存?

什麼緩存?

另一種方法是爲每個數據源分配一個SessionFactory,儘管每個數據源的模式都是相同的...所以我認爲這是浪費。

哦,這是一種浪費,但這就是你想要做的(每個用戶一個數據庫)。並且您沒有選擇(每個數據庫需要一個SessionFactory)。爲什麼實際上每個用戶需要一個數據庫?你確定這是一個明智的決定嗎?正如已經暗示的那樣,這意味着很多麻煩,不能很好地擴展,增加複雜性等。爲什麼不使用單個數據庫並將數據關聯到用戶?

反正選擇數據源需要動態 - 它們不能在上下文文件中預先配置,因爲每個新用戶都將創建自己的數據庫。有沒有現有的框架/解決方案?

不是我所知。這也是爲什麼我認爲你必須以編程方式做所有事情的原因。

我不知道太多關於Hibernate的碎片,也許這工作?

鑑於您的應用程序的動態需求,我不明白它可以提供什麼幫助。

+0

嗨帕斯卡爾,感謝您的回覆。 所有數據庫都具有相同的模式,因此所有這些數據庫的一個SessionFactory都可以。 如果我從2個不同的數據庫加載2個唯一的實體但具有相同的ID,Hibernate有2級緩存,可能包含無效的緩存數據。 我想我可以通過將DataSource與HttpSession關聯,並使用Interceptor將HttpSession中的DataSource附加到ThreadLocal,以便我的AbstractDataSource impl可以獲取正確的事務DS。 – Dzhu 2010-10-04 21:59:11

+0

Ken DeLong文章+1,它爲我節省了一些頭痛:-) – opyate 2011-03-30 21:42:02