Hibernate e Web

pessoal, to com um problema que não estou conseguindo resolver.

tenho uma appweb com hibernate.
há uma action generica com todos os controles genericos: controle de acesso, beans, transações, exceptions…

sempre quando a action generica é executada, a ultima session do hibernate é fechada. Alem disso abro uma transação (e session) e a fecho ao final da execução da action. Porem existe objetos (lazy do hibernate) que são carregados durante a execução do JSP, o que não me permite fechar a session ao final da action e sim no inicio da proxima action (ou a ultima session).

public abstract class GenericAction extends Action {
	
	public final ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		Persistencia.closeSession();
		ActionForward forward = null;
		try{
			Persistencia.initTransaction();
			forward = onExecute(mapping, form, request, response);
			Persistencia.commit();
		}catch(PermissionException e){
			Persistencia.rollback();
			....
		}catch(Exception e){
			Persistencia.rollback();
			...
		}finally{
			...
		}
		return forward;
	}

	public abstract ActionForward onExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception;
}

está correto o que eu fiz?

aparentemente está tudo ok.
starto o servidor e uso normalmente, sem problemas…
o que está acontecendo é que após um bom periodo sem uso, acontece um monte de erros no hibernate. parece que é um timeout. Talvez seja na ultima session que foi fechada ou então na SessionFactory que foi perdida.

um dos erros:
org.hibernate.exception.GenericJDBCException: could not execute query

ninguem sabe hibernate aqui não???

Com essa quantidade de informações companheiro, nem o Gavin King ia adivinhar. Pegue o stack-trace da exceção e veja os logs do Hibernate.

acho que sei o que está acontecendo.

fiz algumas alterações…
usei filtros http://www.guj.com.br/java.tutorial.artigo.11.1.guj para servlets e adicionei um closeSession() para que as sessoes abertas fossem fechadas.

mesmo assim dá um erro apos muito tempo sem atividade.

o problema parece que é na conecção…
após um tempo, a conection com o bd é fechada, ai quando vou iniciar uma session dá este erro:

java.sql.SQLException: No operations allowed after connection closed.
	at com.mysql.jdbc.Connection.checkClosed(Connection.java:2647)
	at com.mysql.jdbc.Connection.rollback(Connection.java:1410)
	at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:134)
	at org.noip.fabiobh.db.Persistencia.rollback(Persistencia.java:240)
	at org.noip.fabiobh.control.action.GenericAction.execute(GenericAction.java:54)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.noip.fabiobh.db.SessionFilter.doFilter(SessionFilter.java:43)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:534)

alguem usa hibernate neste mundo???

realmente o problema é a conecção que está fechando por timeout.

como faço para ver se a conecção está fechada?
e como reabrir a conecção???

Você está utilizando algum pool? Qual?

E mais uma coisa: o forum é algo comunitário, e o pessoal que ajuda os
outros faz isso no tempo livre - o que, em muitos casos, é quase
inexistente. Se ninguém respondeu ainda, tenha paciencia e espere até
que alguem o faça :wink:

ok, mas ja tem 2 dias e ninguem falou nada.
em outros topicos percebe-se que as respostas são bem rápidas.

deixa pra lá…

em relação ao pool, não usei…
sei poco sobre pool…
se puder, me explique como é, como funciona e como implementar?

vlw!

Como o colega explicou, sua dúvida não foi muito boa incialmente ;D

Pool:
http://www.hibernate.org/214.html

Primeiro que fviana é muito groça para quem sabe pouco, tem coisas feias nesse código, um deles é iniciar transação com banco de dados na action isso não se faz é muito feio, segundo é bom estudar um pouco e ler sovbre EntityManager ele vai cuidar do estado dos seus objetos, e você fica fechando conexão na mçao so pode dar problema mesmo, se você fecha a sessão e na jsp faz alguma coisa parecida com isto usuario.nome é lógico que vai dar problema afinal não existe mais como o objeto ser recuperado ja que você matou a sessão a qual o mesmo estav arelacionada!! pelo visto vc não sabe nada de java e Hibernate a e padrões e nem modelo de 3 camadas.