ThreadLocal no Hibernate
Olá pessoal, bom dia.
Estou com uma dúvida conceitual.
Guardar os valores das sessões e transações do hibernate em um objeto ThreadLocal para garantir que todos os objetos dentro de uma mesma thread possam acessar o hibernate sem problemas de concorrência é uma boa prática?
Ps: Estou desenvolvendo uma aplicação Web.
Agradeço desde já os comentários.
Estou com uma dúvida conceitual.
Guardar os valores das sessões e transações do hibernate em um objeto ThreadLocal para garantir que todos os objetos dentro de uma mesma thread possam acessar o hibernate sem problemas de concorrência é uma boa prática?
Ps: Estou desenvolvendo uma aplicação Web.
Agradeço desde já os comentários.
Alesander
Curtidas 0
Respostas
Davi Costa
09/10/2012
Depende da situação seu sistema tem essa especificidade?
Senão tiver não precisa.
att Davi
Senão tiver não precisa.
att Davi
GOSTEI 0
Alesander
09/10/2012
Estou fazendo uma prova de conceito para verificar a questão de desempenho, pois estou utilizando o hibernate. Com isso
vou poder associar uma sessão e uma transação nessa Thread no inicio da requisição.
Todos os objetos criados ou utilizados estarão disponíveis dentro da Thread dessa requisição sem nenhum problema.
Ao realizar um tipo de persistência ele procura uma sessão na Thread corrente, se não houver nenhuma ele cria uma nova sessão e associa ela com a Thread corrente e retorna a sessão;
Apenas uma questão de otimização e desempenho.
Obrigado
vou poder associar uma sessão e uma transação nessa Thread no inicio da requisição.
Todos os objetos criados ou utilizados estarão disponíveis dentro da Thread dessa requisição sem nenhum problema.
Ao realizar um tipo de persistência ele procura uma sessão na Thread corrente, se não houver nenhuma ele cria uma nova sessão e associa ela com a Thread corrente e retorna a sessão;
Apenas uma questão de otimização e desempenho.
Obrigado
GOSTEI 0
Davi Costa
09/10/2012
Olho só por esse lado tudo bem, mas se nesse processo vc deixar as sessões abertas isos não é performático, então se a questão não fala em deixar as sessões abertas pode ser mais performático sim.
att Davi
att Davi
GOSTEI 0
Alesander
09/10/2012
Olá Davi, abaixo o meu hibernateUtils.
Obrigado.
Obrigado.
public class HibernateUtils {
private static final SessionFactory SESSION_FACTORY;
private static final ThreadLocal SESSIONT = new ThreadLocal();
private static final ThreadLocal TRANSACTIONT = new ThreadLocal();
static {
try {
SESSION_FACTORY = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
}
public static Session getSession() {
if ( SESSIONT.get() == null ) {
Session session = SESSION_FACTORY.openSession();
SESSIONT.set( session );
}
return (Session) SESSIONT.get();
}
public static void closeSession() {
Session session = (Session) SESSIONT.get();
if ( session != null && session.isOpen() ) {
SESSIONT.set(null);
session.close();
}
}
public static void beginTransaction() {
Transaction transaction = getSession().beginTransaction();
transactionThread.set(transaction);
}
public static void commitTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if ( transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack() ) {
transaction.commit();
transactionThread.set(null);
}
}
public static void rollbackTransaction() {
Transaction transaction = (Transaction) transactionThread.get();
if ( transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack() ) {
transaction.rollback();
transactionThread.set(null);
}
}
}GOSTEI 0
Alisson Santos
09/10/2012
Acho que para uma boa preformace não deve ser deixado uma secção aberto, acho que você poderia assim que precisasse abri-lá.
GOSTEI 0
Alesander
09/10/2012
Olá Alisson, boa tarde. Concordo com você.
O trecho de código abaixo faz isso ae para mim, mas de forma automática, identificando nas threads.
Abraços
O trecho de código abaixo faz isso ae para mim, mas de forma automática, identificando nas threads.
public static void closeSession() {
Session session = (Session) SESSIONT.get();
if ( session != null && session.isOpen() ) {
SESSIONT.set(null);
session.close();
}
Abraços
GOSTEI 0