Vraptor 4 + Hibernate Session and Session Factory

Olá Pessoal, criei uma aplicação onde tenho diferentes bancos de dados!
Esta aplicação hoje está com o VRAPTOR 3 … tem 9 anos de vida e vai muito bem obrigado!
No entando, depois de uma migracao de servidor alguns problemas de sessoes em aberto comecaram a ocorrer. Como era mais dificil achar os vazamentos que rever minha fabrica de sessoes desde o comeco optei logo por mudar a parada toda!!! Embora tenhamos muitos modulos, dada a convesao do Vraptor, tenho facilidade em refactorys … OK! Detalhe tenho 4 bases de dados conectadas a mesma aplicacao!

Com o novo Vraptor eu criei uma classe AplicationScoped que conecta ao banco ok.
Depois fiz uma classe RequestScoped que pega a instancia imutavel da aplicationscoped e abre diferentes sessoes por Requisicao.
Ok!
Até ai maravilha neh: Uma instancia unica como Escopo de Aplicacao se oferece para que instancias de requisicao usufruam da primeira para abrir sessoes!

Maravilha neh! OK!
Agora vamos matar as sessoes abertas pelas RequestScopeds?
Sim: Para isso uso o PreDestroy sobre um metodo (close) na instancia RequestScoped (o que seria a fabriaca de sessoes ) !

No entando pra relacionar Models entre diferentes bancos uso uma chamada estática da mesma fabrica !!!

Saberiam me dizer se estou no caminho certo?
Na versao 3 do vraptor comecei a ter vazamentos (sessoes abertas) … que depois de alguns dias pararam … a jvm tbm estuda este cenário !!! Sei que é tudo muito loko quando se fala sem sessionfactory entao peço que avaliem o codigo que segue! Enquadra-se em um bom modelo de fabrica e, principalmente, tende a matar sessoes fabricadas?

Desde ja obrigado!
Abs, Davi

package br.com.brabus.epico.infra.session;

import javax.enterprise.context.ApplicationScoped;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

@ApplicationScoped
public class EpicoSessionFactory {

private final SessionFactory factory;

public EpicoSessionFactory() {
    this.factory = new Configuration().configure("epico.hibernate.cfg.xml").buildSessionFactory();
}

public SessionFactory getSessionFactory() {
    return factory;
}

}

package br.com.brabus.epico.infra.session;

import javax.annotation.PreDestroy;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;

import org.hibernate.Session;

@RequestScoped
public class ESessionFactory {

@Inject
private EpicoSessionFactory epicoSessionFactory;
private final Session epicoSession = epicoSessionFactory.getSessionFactory().openSession();

@Produces @RequestScoped
public Session getEpicoSession() {
	return epicoSession; 
}

@PreDestroy
public void close() {
    if (epicoSession.isOpen()) {
    	epicoSession.close();
    }
}

}