ThreadLocal + Web [RESOLVIDO]

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

Pode usar ThreadLocal em web sim sem problemas.

Cada requisição que um usuário faz ao sistema, gera uma nova thread (Servlet).

O ThreadLocal é uma estrutura igual ao HashMap, mas é por Thread. Entao Threads diferentes nao acessam os mesmos valores.

Neste seu caso, cada sessão do hibernate, que possui uma conexão com o banco de dados, é criada para cada requisição… uma Sessão não interfere na outra…

abraço

Fala ricardolecheta!

entendi… vou explicar pq da dúvida. estou com um sistema… onde tenho alguns usuário ( 100 aprox.) usando o sistema simultaneamente…
e as vezes estoura uma Session is closed pensei q algum usuário poderia está utilizando um endereço de Session de outro usuário e melando… Quando esse erro ocorre, derruba alguns usuários juntos.

Estou tentando descobrir se está havendo algum tipo de concorrêcia. Aqui colocamos a Session do hibernate na httpSession ela não é fechada, só qnd ocorre um logout, como o link abaixo que eu havia passado estou tentando melhorar, mas creio q esse não é o problema já q vários usuários estão sendo afetados.

[]´s

Regra:
Nao coloque a session do hibernate na HttpSession

A cada request vc abre uma nova session do Hibernate, utilize o ThreadLocal para isto. E no fim da request, vc fecha a session do Hibernate para liberar a conexão.

Faça isto e o problema vai terminar

E ai ricardolecheta.

Fiz o seguinte… no meu filtro eu coloquei a linha

chain.doFilter(request, response); //fecha a session SessionManager.closeSession();

Se estou correto quando coloca abaixo do chain.doFilter a JSP já foi executada neh… funcionou na boa… não deu problema de lazy nem session close.

Minha dúvida é… fiz em alguns códigos, que nesse ponto ao invés de apenas fechar, o código seria parecido com isso.

chain.doFilter(request, response);
//retorna session
Session sh = SessionManager.getSession();
synchronized (sh) {
	sh.close();
}

Existe a possibilidade de ocorrer excessoes no primeiro exemplo? Seria aconselhável a sincronização?!

OBS: fiquei até curioso sobre a classe ThreadLocal, como ele se comporta , pois a mesma é estática e o método get nunca retorna uma session diferente da requisição atual.

Vlw pela força
abraços

se o SessionManager usa um ThreadLocal nao precisa sincronizar pq ele vai pegar a session da Thread atual… e vai fechar sem interferir em outra

Fala lek!!
Parece que o erro acabou!!

Tirei tudo da HttpSession e coloquei depois do chain.doFilter(request, response);

Vlw pela força!

Abraços!!