2012-07-14 79 views
2

有沒有一種方法可以讓JPA(Eclipselink專門)動態選擇一個連接池,具體取決於綁定到當前線程的某些屬性?JPA/Eclipselink - 動態選擇DataSource/JDBC URL

我試圖解決的問題是縮放多租戶系統,其中租戶可能會分成多個數據庫實例。每個數據庫實例都是多租戶的,但爲了擴展,我可能無法舒適地將所有租戶安裝在一個數據庫實例中。

我熟悉@Multitenant以支持單表多租戶,並已成功使用Eclipselink會話事件回調來動態地設置Eclipselink Session中的值。我正在嘗試更改EntityManager將要使用的DataSource的下一步,因此我不必一定要使用羣集數據庫。

謝謝!

+0

有多少數據源?它們可以在啓動時初始化,還是太多? – sinuhepop 2012-07-20 08:23:40

回答

0

看看這個

http://code.google.com/p/jdbc-helper/wiki/LoadBalancingDataSource

它創建loadbalances到後端數據源的數據源。

+2

不幸的是,我不只是試圖加載平衡,我試圖根據當前請求/線程的某些屬性顯式指定目標數據源。 – wrschneider 2012-07-15 01:56:55

+0

擴展LoadBalancingDataSource並重寫getConnection以根據threadlocal變量從connectionPools中選擇特定的connectionPool。我沒有使用LoadBalancingDataSource,所以我不能保證它的質量。 – 2012-08-07 06:14:39

+1

請注意Eclipselink共享的二級緩存,它可能因不一致的數據庫而中毒 – 2012-08-07 06:16:09

0

您可以使用EntitiyManagerFactory它允許EntitiyManager創建特定datsasource(通過String屬性)

http://foobar.lu/wp/2010/12/30/change-jpa-entitymanager-connection-properties-at-runtime/

+1

我正在爲'EntityManager'使用'@ PersistenceContext'注入並希望保留它。我不想在我的應用程序代碼中管理創建和關閉EntityManagers。如果您知道如何通過EclipseLink會話回調完成同樣的事情,那將是理想的。 – wrschneider 2012-07-20 14:21:05

0

下,作爲解釋你可能要檢查this post。這可能會有所幫助,或者讓您瞭解如何實現解決方案。

+1

可以在單個安裝/實例中切換模式/數據庫,但它不允許我動態選擇主機。 – wrschneider 2012-07-23 19:55:14