Мне интересно узнать о лучших методах управления соединениями с базами данных в 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();
}
}
}