ThreadLocal no Hibernate

Java

09/10/2012

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.
Alesander

Alesander

Curtidas 0

Respostas

Davi Costa

Davi Costa

09/10/2012

Depende da situação seu sistema tem essa especificidade?
Senão tiver não precisa.

att Davi
GOSTEI 0
Alesander

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
GOSTEI 0
Davi Costa

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
GOSTEI 0
Alesander

Alesander

09/10/2012

Olá Davi, abaixo o meu hibernateUtils.
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

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

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.

public static void closeSession() {
Session session = (Session) SESSIONT.get();
if ( session != null && session.isOpen() ) {
SESSIONT.set(null);
session.close();
}


Abraços

GOSTEI 0
POSTAR