Bom dia!
Desde que começei a trabalhar com Hibernate, percebi que a antiga maneira manual de |Abre conexao| Executa SQL | Fecha conexão | era muito trabalhosa e passivel a erros.
Descobri que usando o famoso OpenSessionInView com o Hibernate facilitaria muito as coisas. Mesmo abrindo e fechando a conexãp/transação, fica de uma forma transparente para meus ManagedBeans
Desde então, utilizo isso sempre em meus projetos, apenas adaptei para trabalhar com JPA:
<filter>
<filter-name>JPASessionRequestFilter</filter-name>
<filter-class>br.com.teste.JPASessionRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JPASessionRequestFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
public class JPASessionRequestFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
JPAHelper.beginTransaction();
chain.doFilter(request, response);
JPAHelper.commitTransaction();
} catch (Exception e) {
e.printStackTrace();
}
}
public void init(FilterConfig filterConfig) throws ServletException { }
public void destroy() { }
}
Sendo assim, sempre que chamar qualquer action JSF, ele sempre abrirá minha conexão/transação, e comitará no final.
Tudo isso funciona perfeitamente, mas sempre tive a impressão de que esta implementação é um pouco frágil.
Projetos grandes sempre usam datasource dos application servers, mas na verdade nunca usei, sempre fiz usando Filters e sempre funcionou.
Qual é a real vantagem de se usar a transação controlada pelo contâiner ? Usando filtros, não fico acoplado no contâiner.
Como um contâiner com o JBoss AS, por exemplo, pode me dar uma garantia de escalabilidade e confiança nas transações e conexões JPA ?