2012-02-28 54 views
0

我們將Mongo Db用作數據庫。將多個數據庫(而不是一個)添加到現有應用程序

如果我們得到以下JAX-RS服務(或其他無狀態/有狀態的EJB)。

@Path("my_service_path") 
@Stateless 
public class GetSomeObject{ 

    @Inject 
    public DB database; 

    @GET 
    @Consumes("application/json") 
    @Produces("application/json") 
    public SomeDomainObject get(@QueryParam("some_param") String param){ 
    ... 
    database.find(...); 
    ... 
    return something; 
    } 
} 

問題:我們需要使用兩個以上的數據庫,但在我們的電流源,它似乎是不可能的。我們目前正在使用注入的數據庫,但如果我們使用EntityManager實現或其他的東西,我們會遇到同樣的問題。是否有一些集成的解決方案用於注入不同類的實例,具體取決於用戶/應用程序。我們可以嘗試

@Inject 
    public Map<String, DB> databases; 

但是我們必須添加太多的條件邏輯來處理這些數據庫映射。

回答

1

在DI框架中執行此操作的典型方法是通過限定符。如果您使用CDI,那麼您可以通過生產者和限定符註釋的組合來完成此操作。我發現這是一個很好的方法,用於選擇編譯時已知的幾個實例。如果您需要根據運行時信息檢索實例,則可能需要使用Factory。

對於CDI,這裏是一些僞代碼:

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface PrimaryDatabase { 
} 

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface SecondaryDatabase { 
} 

public class DatabaseProducer { 

    @Produces 
    @PrimaryDatabase 
    public DB getPrimaryDB() { 
     // ... 
    } 

    @Produces 
    @SecondaryDatabase 
    public DB getSecondayDB() { 
     // ... 
    } 
} 

public class GetSomeObject{ 

    @Inject 
    @PrimaryDatabase 
    public DB primaryDB; 

    @Inject 
    @SecondaryDatabase 
    public DB secondaryDB; 
} 
相關問題