Java 将多个数据库(而不是一个)添加到现有应用程序

Java 将多个数据库(而不是一个)添加到现有应用程序,java,database,dependency-injection,Java,Database,Dependency Injection,我们使用Mongo Db作为数据库 如果我们得到以下JAX-RS服务(或其他无状态/状态完整EJB) 问题是:我们需要使用两个或两个以上的数据库,但在我们目前的数据源中,这似乎是不可能的。我们目前使用的是注入式DBs,但是如果我们使用的是EntityManager实现或其他东西,我们会遇到同样的问题。根据用户/应用程序的不同,是否有一些用于注入类的不同实例的集成解决方案。我们可以试试 @Inject public Map<String, DB> databases; @In

我们使用Mongo Db作为数据库

如果我们得到以下JAX-RS服务(或其他无状态/状态完整EJB)

问题是:我们需要使用两个或两个以上的数据库,但在我们目前的数据源中,这似乎是不可能的。我们目前使用的是注入式DBs,但是如果我们使用的是
EntityManager
实现或其他东西,我们会遇到同样的问题。根据用户/应用程序的不同,是否有一些用于注入类的不同实例的集成解决方案。我们可以试试

  @Inject
  public Map<String, DB> databases;
@Inject
公共地图数据库;

但是我们必须添加太多的条件逻辑来处理这些数据库映射。

在DI框架中这样做的典型方法是通过限定符。如果您使用的是CDI,那么您可以通过生产者和限定符注释的组合来实现这一点。我发现这是一个很好的方法来选择编译时已知的一些实例。如果需要根据运行时信息检索实例,则可能需要使用工厂

对于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;
}
@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;
}