Tomcat + ActiveJDBC: открыть/закрыть соединение с помощью фильтра сервлета?

Мое веб-приложение использует ActiveJDBC. Эта структура ORM требует открывать новое соединение с БД с каждым новым потоком (и, конечно же, закрывать его, когда поток завершается). Мне интересно, лучший ли способ добиться этого — использовать веб-фильтр.

если это так, куда мне звонить Base.open()? варианты init() или doFilter(). Кроме того, если я планирую вызывать Base.close() в destroy(), мне нужно знать, что действительно destroy() всегда вызывается при завершении потока, независимо от того, нормально это или ненормально.

РЕДАКТИРОВАТЬ: после прочтения о фильтрах сервлетов я теперь считаю, что правильной обработкой будет открытие и закрытие соединения в doFilter():

public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException { 
  Base.open();
  chain.doFilter(request,wrapper);
  Base.close(); 
} 

это правильный путь?


person Sharon Ben Asher    schedule 20.07.2016    source источник


Ответы (2)


Да, это правильный способ открытия и закрытия соединения для ActiveJDBC в веб-среде.

Кроме того, это подходящее место для управления исключениями. Например, вы можете управлять транзакциями следующим образом:

try{
  Base.openTransaction(); 
  chain.doFilter(request,wrapper);
  Base.commitTransaction(); 
}catch(Exception e){
  // log exception
  Base.rollbackTransaction();
}finally{
  Base.close();
}

В конечном счете, вместо того, чтобы иметь дело с сервлетами, почему бы не попробовать ActiveWeb? Подробнее см. здесь: http://javalite.io/database_configuration

person ipolevoy    schedule 20.07.2016

Однако это правильная реализация, чтобы масштабировать ваше приложение, вам может понадобиться пул соединений с базой данных, и в этом случае вы захотите сохранить свои соединения даже после выполнения операций с базой данных.

person Max Alexander Hanna    schedule 20.07.2016
comment
почему вы думаете, что я не использую пул соединений? даже в пуле соединений вы делаете conn.close(), чтобы вернуть его в пул... - person Sharon Ben Asher; 21.07.2016