Fórum ThreadLocal no Hibernate #425815
09/10/2012
0
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
Curtir tópico
+ 0Posts
09/10/2012
Davi Costa
Senão tiver não precisa.
att Davi
Gostei + 0
09/10/2012
Alesander
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
09/10/2012
Davi Costa
att Davi
Gostei + 0
09/10/2012
Alesander
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
09/10/2012
Alisson Santos
Gostei + 0
09/10/2012
Alesander
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
Clique aqui para fazer login e interagir na Comunidade :)