2011-05-05 50 views
3

是否有可能在運行時使用Hibernate創建新數據庫(使用模型對象的註釋作爲模式,我們定義的正常模式文件使用),然後獲取到該數據庫的連接,以便它可以用嗎?我們想要做的是,當某個動作發生時(例如創建一個新用戶),我們爲該用戶創建一個新的數據庫(來自定義的註釋或簡單的靜態模式),然後讓該數據庫的句柄,以便用戶可以寫入該數據庫。使用Hibernate在運行時創建數據庫?

用戶的事情僅僅是用於說明概念...

謝謝!

回答

5

在一個高的水平,你會做成就一番什麼樣子是這樣的:

  1. 當觸發事件發生時,執行DDL創建通過JDBC連接一個新的數據庫 - 可能使這個模式最適合在構建時由hbm2ddl生成。

  2. 建設這個數據庫中的新DataSource,並從DataSource

  3. SessionFactorySessionFactory應該再注入(或擡頭的)應用程序的數據訪問層,找到了適合用戶的SessionFactory

總之,答案是動態構造SessionFactory情況下爲每個連接/數據庫,並確保您的數據訪問層知道如何找到爲準則,適當SessionFactory

+0

這似乎是最合理的解決方案。這是可擴展的嗎?單個應用程序可以保存多少個會話工廠(及其數據源)? – 2011-05-06 10:01:33

+0

我不知道,但如果你做一些基準測試和測試,我很樂意看到結果:) – 2011-05-06 13:34:38

1

同意matt b,但是你確定做這樣的事情是個好主意嗎?

我想你有不同的客戶,並希望將每個人的數據存儲在一個單獨的數據庫(或類似的東西)。 爲什麼不將所有客戶數據存儲在同一個數據庫中,並通過客戶ID過濾這些數據?

+0

正如我在問題中所說的,我給出的客戶例子就是這樣一個例子。這不是我們要使用它的方式,但原則是一樣的。此外,我們現在只是在研究不同的方法。另一個我們正在看的是通過使用一個鍵(如客戶ID)分離。 – 2011-05-05 19:06:20

1

我以前在公司跟蹤過一個討論,他們正在談論春天對此的支持。

有些事情會感興趣: http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/aop/target/HotSwappableTargetSource。 html

AbstractRoutingDataSource對您的情況似乎很有趣。也有人說,這也許禁用第二Hibernate的緩存,以確認...

1

我回來晚了一點,但如果找你計劃建立一個多租戶SaaS應用程序,就像你說的,你也可以使用按客戶ID等鍵分離。

在休眠狀態下,過濾器可以幫助您做到這一點......

參見: http://www.lunatech-research.com/archives/2011/03/04/play-framework-writing-multitenancy-application-hibernate-filters

這是一個鏈接,遊戲框架,但它使用Hibernate,所以你可以做幾乎與經典的Java EE的東西一樣...

+0

@Sebastian Lorber - Jip,這就是我們已經實現的。它被稱爲基於鑑別器的多租戶。 – 2011-05-26 07:15:21

相關問題