2015-03-23 5 views
7

Привет, Я пытаюсь создать приложение с использованием рамки dropwizard. У меня есть классы DAO impl, которым нужен дескриптор экземпляра диспетчера соединений, который затем будет использоваться для получения соединений с базой данных. У меня есть приложение базы данных с несколькими арендаторами. Этот диспетчер подключений будет выполнять пользовательскую реализацию.jdbi, guice with dropwizard

Приложение использует hikari cp в качестве пула соединений и базы данных mysql. Я хочу инициализировать пул данных и пул соединений, используя функцию управляемого объекта dropwizard. После того, как источник данных инициализируется я хочу, чтобы ввести экземпляр менеджера соединения в каждом из дао классов, используя Guice что-то связывающую как

bind(ConnectionManager.class).toProvider(ConnectionManagerProvider.class); 

Тогда в каждом дао осущ классов

@Inject 
public class UserDAOIpl extends AbstractDAO { 
    protected UserDAOImpl(ConnectionManager connectionManager) { 
     super(connectionManager); 
    } 
} 

Я смотрел повсюду в сети нет конкретного примера для моего случая использования. Также есть недостаток документации на dropwirzard.io

Это скорее вопрос архитектурного дизайна, а не вопрос кода.

Модуль источника данных будет отдельным модулем, который будет использоваться во многих службах. Я использую maven как инструмент сборки.

Мои вопросы

  1. Как я могу подойти к этой ситуации? Некоторые имена классов и строки руководства по реализации были бы очень полезными.
  2. Приложение будет передавать полмиллиона запросов в день. Решение должно быть осуществимым.

Я с нетерпением жду сообщества для любого руководства или если какой-либо орган может указать мне на некоторые хорошие ресурсы.

ПРИМЕЧАНИЕ. Мы не будем использовать спящий режим для этого приложения и будем использовать JDBI.

+0

Является ли этот подход решает мульти договора аренды с MySQL? –

ответ

7

Я подготовил установку, аналогичную той, которую вы описали следующим образом. Он устанавливает guice, инициализирует DBIFactory (вам, возможно, потребуется принять эту часть для вашего сценария). Затем объект JDBI передается реализации репозитория, который может использовать его для сохранения объекта типа Vessel.

(1) Добавление Guice к проекту

<dependency> 
    <groupId>com.hubspot.dropwizard</groupId> 
    <artifactId>dropwizard-guice</artifactId> 
    <version>x.x.x</version> 
</dependency> 

(2) Установка Guice в initialize():

guiceBundle = GuiceBundle.<YourConfiguration>newBuilder() 
     .addModule(new GuiceModule()) 
     .enableAutoConfig("your.package.name.heres") 
     .setConfigClass(YourConfiguration.class) 
     .build(); 

(3) Guice конфигурации для приготовления JDBI элементов

public class GuiceModule extends AbstractModule { 

    private DBI jdbi; 

    @Provides 
    public DBI prepareJdbi(Environment environment, 
          SightingConfiguration configuration) throws ClassNotFoundException { 
     // setup DB access including DAOs 
     // implementing a singleton pattern here but avoiding 
     // Guice to initialize DB connection too early 
     if (jdbi == null) { 
      final DBIFactory factory = new DBIFactory(); 
      jdbi = factory.build(environment, configuration.getDataSourceFactory(), "h2"); 
     } 
     return jdbi; 
    } 

    @Provides 
    public VesselJDBI prepareVesselJdbi(DBI jdbi) { 
     return jdbi.onDemand(VesselJDBI.class); 
    } 

    @Override 
    protected void configure() { 
     bind(VesselRepository.class).to(VesselRepositoryImpl.class); 
     /* ... */ 
    } 
} 

(4) начните использовать его в своих классах

public class VesselRepositoryImpl implements VesselRepository { 

    private VesselJDBI jdbi;  

    @Inject 
    public VesselRepositoryImpl(VesselJDBI jdbi) { 
     this.jdbi = jdbi; 
    } 

    public Vessel create(Vessel instance) { 
     return jdbi.inTransaction((transactional, status) -> { 
      /* do several things with jdbi in a transactional way */ 
     }); 
    } 

} 

(обратите внимание: пример последнего использованного кода Java 8. Для использования JDBI с Java 8 с Dropwizard 0.8.1, пожалуйста, используйте jdbi версию 2.62, чтобы избежать ошибок https://github.com/jdbi/jdbi/issues/144)

Пожалуйста, дайте мне знать, если это помогло вам ,

С наилучшими пожеланиями,

Александр

+0

Слишком поздно, я опубликую то, что я реализовал, мне нужны комментарии по моей реализации. – Syed

+0

Извините, было уже слишком поздно. Я с нетерпением жду вашего решения. Если вы не хотите размещать его здесь, посмотрите мой профиль, чтобы связаться со мной по электронной почте. – ahus1

+0

Слишком поздно в ответ, я был занят над вышеупомянутым проектом. Я реализовал как бы инициализацию jdbi и hikari cp, используя функцию управляемых объектов dropwizard, и после инициализации я сохранил их в статических переменных и написал провайдера guice, который вернет эту инициализированную статическую переменную. Это индивидуальный артефакт maven и используется во всех микросервисах – Syed

0

Я не могу комментировать, но хотел бы добавить к ответу Алекса:

Для реализации хранилища, я рекомендую иметь хранилище обрабатываться jDBI вместо использования Guice. Вот что я сделал:

В модуле Guice, добавьте обеспечивают метод:

@Provides 
@Singleton 
public void repository(Dbi dbi) { 
    // dbi.onDemand(whateverYourClassIs.class) 
} 

в классе хранилища, используйте @CreateSqlObject, чтобы ваши объекты DAO распространяемым:

public abstract class Repo { 
    @CreateSqlObject 
    abstract Dao dao(); // will return a jDBI managed DAO impl 

    public void doWhatever() { 
     /// logic 
    } 
} 

Это имеет что вы можете теперь использовать аннотации jDBI. (Я не нашел способ использовать их с guice напрямую). Это очень хорошо, например, если вам нужно выполнить код DAO в транзакции. Репозиторий по-прежнему обрабатывается внутри Guice, поэтому его можно вводить в любом месте, но jDBI обрабатывает сложные биты в коде DAO/Repository.

Надеется, что это помогает :)

Артуру

+0

Вы также можете попытаться предложить отредактировать ответ Алекса. – kenorb

Смежные вопросы