To fazendo um projeto e resolvi assumir a abordagem de abrir uma sessao no ServletFilter, deixa-la disponivel durante toda requisição e fecha-la depois. To fazendo isso com threadlocal seguindo aquele exemplo do Mauricio Linhares aqui no guj. Mas mesmo assim quando eu chamo os atributos que sao colecoes dentro da minha classe ele fica da aquela excessao no session … Pq?
packagescc.web;importhelpframework.persistencia.util.HibernateUtil;importhelpframework.util.HelpUtil;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;publicclassConnectionManagerFilterimplementsFilter{privatebooleaneTransacional;privateLoglog=LogFactory.getLog(ConnectionManagerFilter.class);publicConnectionManagerFilter(){super();// TODO Auto-generated constructor stub}publicvoidinit(FilterConfigconfig)throwsServletException{// TODO Auto-generated method stubStringarg0=config.getInitParameter("transacional");if(!HelpUtil.isPropriedadeVazia(arg0)){eTransacional=Boolean.parseBoolean(arg0);}}publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,FilterChainarg2)throwsIOException,ServletException{// TODO Auto-generated method stubStringurl=((HttpServletRequest)arg0).getRequestURI();HibernateUtil.getSession();log.debug("Conexao aberta com sucesso para url "+url);try{if(eTransacional){HibernateUtil.beginTransaction();log.debug("Iniciando transancao para a url "+url);}arg2.doFilter(arg0,arg1);if(eTransacional){HibernateUtil.commitTransaction();log.debug("Fechando transacao para url "+url);}}catch(Exceptionexception){log.error(exception);thrownewServletException(exception);}finally{HibernateUtil.closeSession();log.debug("Conexao fechada com sucesso para url "+url);}}publicvoiddestroy(){// TODO Auto-generated method stub}}
Alberto
sapulha
Cara, você tá rodando a aplicação em qual servidor?
O JBoss mata a conxão quando vc usa threadlocal, ele vê que vc não tá usando a conexão e mata ela, aí quando vc tenta usar outra vez, cabrum, dá a aexception.
Tive ess problema numa aplicação que eu fiz, e tive que mudar umas configurações no JBoss pra ele não fazer mais isso, só que tive que ter muito cuidado pra não largar nada aberto com o banco sem necessidade.