Problema com queda de conexão ao banco com hibernate

Boa tarde, estou com um problema no meu hibernate q é o seguinte, faço a busca e o resultado me é retornado, se eu deixo o resultado parado na tela e volto a mexer no site 1h depois por exemplo, o hibernate nao executa mais busca nenhuma no meu mysql e começa a der erro de “rollback failed (read time out)”, isso acontece de vez em quando, se alguem puder me ajudar, provavelmente tem algo errado ao fechar ou abrir a Connection, segue abaixo os codigos do hibernate:

Interceptor para abrir e fechar as conexões:

@RequestScoped
@Intercepts
public class HibernateInterceptor implements Interceptor{

	    public void intercept(InterceptorStack stack, ResourceMethod method, Object instance)
	        throws InterceptionException {
	    	Session session = HibernateUtil.openSession();
	        try {
	            session.beginTransaction();
	            stack.next(method, instance);
	            session.getTransaction().commit();
	        } finally {
	            if (HibernateUtil.currentSession().getTransaction().isActive()) {
	                HibernateUtil.rollback();
	            }
	            HibernateUtil.closeCurrentSession();
	        }
	    }

	    public boolean accepts(ResourceMethod method) {
	        return true;
	    }
}

HibernateUtil

public class HibernateUtil {
	private static SessionFactory factory;
	private static ThreadLocal<Session> sessions = new ThreadLocal<Session>(); 
	
	static {
		Configuration cfg = new Configuration();
		cfg.configure();  
        factory = cfg.buildSessionFactory(); 
	}
	
	public static Session openSession(){  
        sessions.set(factory.openSession());  
        return sessions.get();  
    }  
      
    public static Session currentSession(){  
        return sessions.get();  
    }  
      
    public static void closeCurrentSession(){  
        sessions.get().close();  
        sessions.set(null);  
    }  
      
    public static void clearSession(){  
        sessions.get().clear();  
    }  
      
    public static void flushSession(){  
        sessions.get().flush();  
    }  
      
    public static void rollback(){  
        sessions.get().getTransaction().rollback();  
        sessions.get().getTransaction().begin();  
    }  
}

esta usando algum framework?

Pq no seu try/finally vc não faz um catch para saber se qual exception realmente esta acontecendo?

Uso VRaptor

farei isso, mas como nao consigo prever quando ira dar o erro novamente, assim q der eu posto aqui

Quando comecei a usar hibernate tive um problema com a conexão que todo dia ao chegar no trabalho ela parava de funcionar, só depois descobri que o problema era relacionado ao uso do conector padrão do hibernate ao banco de dados, aí eu configurei o C3P0 e funcionou blz

Obrigado pela dica, vou estudar o C3P0