Управление соединениями с базой данных с помощью Stripes, Guice - PullRequest
3 голосов
/ 22 июня 2011

Мне интересно узнать о лучших методах управления соединениями с базами данных в Stripes с Guice.В идеале я хотел бы применить следующее:

Для каждого потока / http-запроса используется одно дБ-соединение (возможно, со скрытой привязкой соединения с провайдером с областью действия ServletScope.REQUEST). Все запросы выполняются в одной транзакциии затем завершили или откатили в конце.

Мой вопрос: что должно создавать / закрывать соединения с моей базой данных?

Не рекомендуется ли использовать перехватчик Stripes для открытия и закрытиясоединения?

У меня большое соединение классов Manager, которые все выполняют пользовательские запросы SQL для различных таблиц в моей базе данных.В настоящее время все эти классы Manager имеют метод, подобный следующему:

public abstract class MyManagerBase implements IMyManager {
  @Inject
  public void setConnection(Connection conn) {
    this.conn = conn;
   }
}

Менеджеры сами подклассируют это и не создают и не закрывают соединение.

У меня есть такие компоненты действия:

public class MyActionBean implements ActionBean {
  @Inject IMyManager myManager;

  @DefaultHandler
  public Resolution save() {
    myManager.doStuff(...);
  }

  ...
}

У меня есть такой пример конфигурации:

public class MyConfigModule extends AbstractModule {

@Override
protected void configure() {

  install(new ServletModule());
  bind(IMyManager.class).to(MyManagerImpl.class);
  bind(Connection.class).toProvider(MyConnectionProvider.class).in(ServletScopes.REQUEST);
}    

Пока что я думаю об использовании перехватчика для ввода менеджеров и в то же время одного и того же соединения ввсе менеджеры для этого http-запроса.

Моя попытка перехватчика до сих пор выглядит так:

@Override
public Resolution intercept(ExecutionContext executionContext) throws Exception {
 Connection conn = null;

 switch( executionContext.getLifecycleStage() ) {
  case ActionBeanResolution:
    log.debug("Intercepting: ActionBeanResolution");
    // Inject dependencies into ActionBeans
    injector.injectMembers( executionContext.getActionBeanContext() );    
    Resolution resolution = executionContext.proceed();
    injector.injectMembers( executionContext.getActionBean() );

    return resolution;
  case RequestComplete:
    log.debug("Intercepting: RequestComplete");

    executionContext.getActionBean();

    Connection conn = injector.getInstance(Connection.class);

    conn.commit();
    conn.close();
  }
}
}

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Это плохая идея использовать перехватчик Stripes, чтобы открывать и закрывать соединения?

Нет, совсем нет, использование фильтра сервлетов или полосового перехватчика является довольно распространенным подходом для реализации сеанса для шаблона запроса (сеанс для каждой операции действительно является анти-шаблоном). Хотя это не означает, что вам также нужно начинать и останавливать транзакции. Например, вы можете сделать явные коммиты в бине действия.

Для инъекций Stripes Action Beans существуют более элегантные методы, чем использование перехватчика. Конфигурация полос в файле web.xml позволяет настроить собственную фабрику Action Bean с параметром ActionResolver.Class. Поскольку фабрика действительно создает экземпляры Action Beans, она также может внедрять параметры конструктора. Это не очень сложно реализовать самостоятельно.

Но вам не нужно реализовывать это самостоятельно, есть отличный плагин Stripes, который обрабатывает инъекцию Action Bean, контекст Action Bean и перехватчики: Stripes Guice . Его очень просто использовать, см .: How-to: Guice Bean управляемого действия

1 голос
/ 22 июня 2011

У нас были некоторые проблемы с использованием перехватчика Stripes для обработки соединений - я думаю, что это как-то связано с тем, что перехватчик иногда не запускается, когда запрос не проходит через ActionBean, хотя я точно не помню.Вместо этого мы в итоге написали Filter для управления ресурсами вместо того, чтобы полагаться на перехватчик.

Kdeveloper находится на правильном пути, однакопредлагает вам использовать Guice для создания ваших ActionBeans вместо вызова injector.injectMembers() для них.Для этого мы используем stripes-guicer , и у нас это хорошо работает.

...