0

我目前正在處理調用無狀態會話Bean的Web應用程序以便與數據庫進行交互。我的問題是關於這樣的應用程序如何調用相同的會話bean,以便後者可以選擇哪個實體管理器必須用來訪問數據庫。在無狀態SessionBean中注入特定EntityManager條件

在目前我管理這個情況推出不同的Jboss的情況下,不同端口上偵聽,並在每個實例我已經部署在同一會話Bean游泳池和一個或多個Web應用程序必須處理相同的數據庫。換句話說,每個Jboss實例都包含一定數量的Web應用程序,持久性單元(persistence.xml in META-INF jar containing the @Entity's)和會話Bean池都在一個耳朵內。 不言而喻,主要缺點在於:作爲我需要處理的更多不同的數據庫,我必須承擔的儘可能多的Jboss實例,它主要是不可持續的,但不僅僅是資源原因。

我的最終問題是:部署不同的Web應用程序調用會話bean的最佳實踐是什麼?

預先感謝

Stfn

回答

0

你想達到什麼是真不明白......

是不同的DB被使用到每個DB分開不同客戶的數據(有相同的結構)?爲此,Hibernate中有一些多租戶支持(http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch16.html),但尚未在JPA中標準化。

任何方式都可以將不同的耳朵放在同一個Jboss實例上(您將需要使用不同的Web上下文名稱)以減少資源消耗。 (但是你會失去os級別的過程控制,一個租戶可以毫無辦法地使用所有資源來確保其他人獲得最少的資源。)

+0

非常感謝Kazaag的回答。讓我再解釋一下。 – user1444322

+0

感謝很多關於你的answer.Let我解釋一些。數據庫是不同的,但具有相同relations.I've已經嘗試第二個解決方案您介紹了,但是還是不行。在同一個容器中(這是我的第一次嘗試),我有Session Beans衝突(第一個會話bean調用用於以下請求,而不管名爲id的應用程序,在會話Bean池級別缺少隔離)以及唯一方法會重命名會話bean接口,這是我爲了維護較輕的代碼而要避免的。所以,讓我試驗第一個概述的解決方案。 Stfn – user1444322

+0

如果EJB不同,它們應該具有不同的全局名稱,因此通過JNDI檢索它們應該會給出相應的名稱。 – Kazaag

0

使用CDI @Producer方法。我假設你懂得,你有@PersistenceContext S中的許多區別對待,所以你做製片人,是這樣的:

// first inject all the entity managers that you have into your CDI producer 
@PersistenceContext(name = "name0") 
private EntitManager em0; 

@PersistenceContext(name = "name1") 
private EntitManager em1; 

@PersistenceContext(name = "name2") 
private EntitManager em2; 

... 

// then have your producer method with logic to chose the right EntityManager to be returned 
@Produces @MyPersistenceContext 
public EntityManager obtainTheRightEM(InjectionPoint caller) { 
    if (hasCondition0(caller)) { 
     return em0; 
    } else if (hasCondition1(caller)) { 
     return em1; 
    } else if (hasCondition2(caller)) { 
     return em2; 
    } else { 
     ... 
    } 
} 

然後在你的@EJB是你與@Inject @MyPersistenceContext更換@PersistenceContext

此外,創建@MyPersistenceContext預選賽可能會或可能不會根據您的具體問題是必要的。如果你有你需要向下傳遞給生產者,以方便上EntityManager從您的生產者返回的決定特別配置值,看看在你的自定義限定使用一些@Nonbinding領域。

你可能最終就要用只有一個@EJB部署。

乾杯!希望這可以幫助。