Hibernate Filter Duvida iniciante

Senhores,
Uma pergunta bem de iniciante, qual a real necessidade desse código?
Entendi que é necessário para abrir uma transação e logo em seguida com o comit salvar os estados das entidades na base de dados…mas ainda nao ficou claro pq então dou um close, sendo que o meu save/update/ ect…ainda nao foram chamados!!!
E outra em termos de performance isso não é ruim? Pois estou debugando e tudo que faço esse código é chamado!!


public class ConexaoHibernateFilter implements Filter{
	
	private SessionFactory sf;

	
	public void destroy() {
	}

	
	public void doFilter(ServletRequest servletFilter, ServletResponse servletResponse,
			FilterChain chain) throws IOException, ServletException {
		
		try {
			this.sf.getCurrentSession().beginTransaction();
			chain.doFilter(servletFilter, servletResponse);
			this.sf.getCurrentSession().getTransaction().commit();
			this.sf.getCurrentSession().close();
		} catch (Throwable ex) {
			
			try {
				if(this.sf.getCurrentSession().getTransaction().isActive()){
					this.sf.getCurrentSession().getTransaction().rollback();
				}
			} catch (Throwable t) {
				t.printStackTrace();
			}
			
			throw new ServletException(ex.getMessage());
		}
	
	}

	public void init(FilterConfig conf) throws ServletException {
		this.sf = HibernateUtil.getSession();
	}

}

Na verdade já foi chamado sim. Quando você faz o chain.doFilter(servletFilter, servletResponse); você está mandando seu código executar e depois c vai finalizar.

O close é para ñ deixar recurso aberto.

Só que esse seu código está vulnerável a ter um “leak memory”.

Seu close não está dentro de um finally, desse modo, se rolar uma exception você vai ficar com recurso preso pois o close não será chamado.

Faça algo como:

try{ ..... commit() } catch (Exception ex) { rollback(); } finally { close(); }