Добавить несколько баз данных (вместо одной) в существующее приложение - PullRequest
0 голосов
/ 28 февраля 2012

Мы используем 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 Ответ

1 голос
/ 28 февраля 2012

Типичный способ сделать это в структуре 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...