2011-03-16 116 views
3

我使用現有的Seam 2.2.0 + JPA(Hibernate 3.3.1)應用程序,該應用程序需要轉換爲每個數據庫模式相同的「每個客戶端的單個數據庫」環境。該應用程序在Glassfish上運行,使用IceFaces,並有幾個利用對話的頁面。它還使用單個EJB進行身份驗證。不幸的是,將客戶分成自己的數據庫的決定超出了我的控制範圍。多租戶Seam + JPA應用程序

由於概念證明,我已經通過使用Spring JPA抽象,本地資源交易活動的EntityManagerFactory(IES)和數據源(S)的管理到應用程序中作出的應用感知多個數據庫,並且ThreadLocal的上下文信息。例如,每次用戶登錄時,如果一個新的EntityManagerFactory尚未初始化,則使用與其數據庫通信的新DataSource進行初始化。這在有少量數據庫的測試環境中運行良好。

我的問題是,這種方法可以擴展到數百個數據庫嗎?我希望將應用程序服務器添加到負載均衡器來處理額外的負載,但是與典型情況相比,Hibernate/JPA第一級緩存和/或Seam上下文管理(也就是內存消耗)的開銷會需要更多的服務器來擴展負載均衡的應用如果是這樣,可以通過分配具有大量RAM和/或大型分佈式緩存的服務器來緩解這種情況嗎?

任何有識之士將不勝感激。

+0

嗨亞歷克斯,你能給我一個例子初始化一個新的EntityManagerFactory使用新的數據源?謝謝。 – 2011-05-24 04:21:49

回答

1

我曾在一個應用這種方法,我什麼,我可以指出的是:

  • DataSource和EntityManagerFactory的管理是最難的部分。不過看起來你已經在測試環境中做過了。仔細檢查你是否對Seam Managed Entity Manager做了正確的事情。
  • 您的應用程序在數百個數據庫上不能很好地擴展,因爲每個數據庫的內存消耗都會線性增加。實際上,對於每個數據庫,您將有不同的實例EntityManagerFactory(Hibernate SessionFactory),每個實例都需要相當數量的Ram。
  • 如果您配置Hibernate二級緩存,請注意可能存在的問題。由於所有SessionFactory都是從相同的數據模型創建的,因此緩存區域名稱可能會發生衝突。我使用hibernate.cache.region_prefix配置參數來使這些名稱在使用數據庫ID作爲緩存前綴的各種實例中唯一。
+0

謝謝@Stefano。我加載測試了像系統這樣的產品上的變化,並得出了相同的結論。我不得不刪除Drools授權,因爲它消耗了每個EntityManagerFactory中大約50%的RAM,並且必須禁用Hibernate註釋掃描,以便明確列出帶註釋的實體類。後者是性能瓶頸並導致同步問題。 – 2011-03-28 15:56:31