Fórum ThreadLocal no Hibernate #425815

09/10/2012

0

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

Responder

Posts

09/10/2012

Davi Costa

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

att Davi
Responder

Gostei + 0

09/10/2012

Alesander

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
Responder

Gostei + 0

09/10/2012

Davi Costa

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
Responder

Gostei + 0

09/10/2012

Alesander

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);
}
}
}
Responder

Gostei + 0

09/10/2012

Alisson Santos

Acho que para uma boa preformace não deve ser deixado uma secção aberto, acho que você poderia assim que precisasse abri-lá.
Responder

Gostei + 0

09/10/2012

Alesander

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

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar