Galera mal mesmo pelo assunto, sei que é mt discutido porém infelizmente gostaria de entder melhor…
Tenho uma aplicação Web com Strtuts + Hibernate 3.
Sempre vejo a internet mts implementações usando ThreadLocal.
...
private static SessionFactory sessionFactory;
public static final ThreadLocal threadSession = new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = null;
if (sessionFactory == null)
{
try {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL cfgURL = classLoader.getResource(fileName);
Configuration configuration = new Configuration().configure(cfgURL);
sessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage());
}
}
s = (Session) threadSession.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
threadSession.set(s);
}
if (s.isOpen() && !s.isConnected())
{
s.reconnect();
}
if (!s.isOpen())
s = newSession();
return s;
}
....
No meio do meio código algum momento irei fazer uma chamda do método currentSession(), por exemplo quando tentar trazer uma lista qlq. Como a aplicação é WEB, 2 ou n pessoas em telas diferente irão fazer essa mesma chamada, porém se eu coloco a Session dentro de uma ThredLocal
s = (Session) threadSession.get();
nesse ponto todo olhariam o mesmo endereço de memória, ou a mesma session. Certo ou Errado?!
E se algum momento alguem executar a seguinte linha
Session s = (Session) threadSession.get();
threadSession.set(null);
if (s != null)
s.close();
A conexão seria perdida por todas as pessoas!!!
Isso é uma implementação que não serviria para web nao é!?!
Qual seria a implementação correta para isso? Esou lendo esse link
http://www.hibernate.org/43.html
Não preciso usar ThreadLocal em uma aplicação web neh!
[]´s e valeu pela atenção