Pessoal gostaria de saber qual o tempo de vida de uma sessão do hibernate, e também gostaria de saber como o hibernate gerencia as sessões, pois estou criando uma aplicação e estou fechando somente as sessões dos métodos de inserir,salvar e deletar, a parte de busca de dados não estou fechando as sessões estou deixando o hibernate gerenciar (Mais ainda nem sei se ele gerencia isso) essas sessões pra mim, gostaria de saber tbm se isso é uma boa pratica.
Ele não gerencia isso até onde eu sei.
Feche todas as conexões que você abrir o mais rápido possível.
Concordo com o jakefrog.
Em relação a gerenciar as conexões, já ouviu falar no C3P0?
Hibernate não faz isso…na verdade vc é que tem que fazer…ou configurar para ser feito.
Existem varias formas.
- Na unha.
- Automaticamente usando implementando com Thread-Local ou Session-in-View
- Configurar algum framework para fazer por vc - Spring.
Obs - Livro Java Persistence com Hibernate cap 11 aborda a maioria destes tópicos.
Uso o esquema de ThreadLocal, abaixo segue meu HibernateSessionFactory:
[code]
import com.arcelormittal.framework.base.logging.Logger;
import com.arcelormittal.framework.util.Util;
import java.io.File;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.stat.Statistics;
public class HibernateSessionFactory {
private static Logger log = Logger.getLogger(HibernateSessionFactory.class);
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static File configFile = null;
static {
try {
configFile = new File(Util.getConfDir() + "/hibernate.cfg.xml");
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception ex) {
log.error("Erro ao criar a sessionFactory. Erro: " + ex);
}
}
private HibernateSessionFactory() {
}
/**
* Retorna a instância Sessão ThreadLocal. Inicializar o Lazy
* O <code> SessionFactory </ code>, se necessário.
*
* @return Session Sessão e já inicia também uma transação.
* @throws HibernateException
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession() : null;
session.beginTransaction();
threadLocal.set(session);
}
return session;
}
/**
* Rebuild hibernate session factory
*
*/
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception ex) {
log.error("Erro ao recriar a fabrica de sessões do hibernate. Erro: " + ex);
}
}
/**
* Fecha a instância única sessão de hibernação.
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* return session factory
*
*/
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* return session factory
*
* fábrica de sessão será reconstruída na próxima chamada
*/
public static void setConfigFile(File configFile) {
HibernateSessionFactory.configFile = configFile;
sessionFactory = null;
}
/**
* return hibernate configuration
*
*/
public static Configuration getConfiguration() {
return configuration;
}
public static Statistics getStatistics() {
if (!sessionFactory.getStatistics().isStatisticsEnabled()) {
sessionFactory.getStatistics().setStatisticsEnabled(true);
}
return (Statistics) sessionFactory.getStatistics();
}
}[/code]
então FernandoFranzini, acredito que esta sendo tratado de forma automatica, ou estou errado?
Errado …pq vc ainda precisa invocar na unha os metodos getSession e closeSession.
Automático seria se vc não tivesse que fazer isso…por exemplo com o uso do Spring que faz isso para vc via AOP.
Mas sua classe esta legal sim!!! Parabéns…
Eu ja usei muito disso em projetos mais simples…
Em projetos mais complexos, prefiro deixar para o spring, deixando meu codigo mais limpo.
Amigo gostaria de aprender fazer isso usando o Spring mais não sei usar o Spring, por acaso vc teria uma classe que use o Spring para que eu possa estar olhando para aprender?
O Spring faz isso tudo “debaixo dos panos” usando PROXY + AOP…não da para ver pq é feito em RUNTIME.
Nesse caso é estudando a coisa toda mesmo, aprende a filosofia e como usa-lo - http://www.amazon.com/Spring-Action-Craig-Walls/dp/1935182358/ref=sr_1_1?s=books&ie=UTF8&qid=1322477494&sr=1-1