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

时间:2012-02-28 15:12:23

标签: java database dependency-injection

我们使用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 个答案:

答案 0 :(得分: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;
}