Perda de Conexão com o Hibernate

Ola pessoal. Desenvolvi um sistema utilizando Hibernate com MySql. Subi o sistema para o JElastc, mas agora estou com um problema de perca de conexão com o banco. O problema é o seguinte, utilizo o sistema hoje, amanhã quando tento conectar novamente ele apresenta o seguinte erro.

Caused by: com.sun.faces.spi.InjectionProviderException
at com.sun.faces.vendor.WebContainerInjectionProvider.invokeAnnotatedMethod(WebContainerInjectionProvider.java:115)
at com.sun.faces.vendor.WebContainerInjectionProvider.invokePostConstruct(WebContainerInjectionProvider.java:95)
at com.sun.faces.mgbean.BeanBuilder.invokePostConstruct(BeanBuilder.java:221)
... 61 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.faces.vendor.WebContainerInjectionProvider.invokeAnnotatedMethod(WebContainerInjectionProvider.java:113)
... 63 more
Caused by: org.hibernate.exception.JDBCConnectionException: could not prepare statement

Para resolver reinicio o TomCat e o sistema volta a funcionar.

E você está fazendo estas conexões como? Diretamente? Está usando pool de conexões? C3P0?

Estou usando C3P0.

	<property name="hibernate.c3p0.min_size">5</property>
	<property name="hibernate.c3p0.max_size">20</property>
	<property name="hibernate.c3p0.timeout">3000</property>
	<property name="hibernate.c3p0.max_statements">50</property>
	<property name="hibernate.c3p0.idle_test_period">3000</property>

Como você está tratando as transações da sua aplicação?

Use a conexao sob demanda. Provavelmente está mantendo o vínculo com o banco de dados o tempo todo. Chega uma hora que o MySql pode abortar a conexao pelo exagero de tempo, o que é normal. Monitore para saber se está acontecendo da conexao se manter aberta mesmo sem requsicoes acontecendo: https://stackoverflow.com/questions/1620662/mysql-see-all-open-connections-to-a-given-database

1 curtida

Eu também acreditei que fosse isso, porém, como ele utiliza C3P0, considerei que poderia ser outra coisa.

O próprio pool, dependendo da configuração, pode deixar conexões abertas muito tempo. Se nao me engano, se esse timeout do pool de 3000 (50 minutos?) for maior que o timeout configurado no MySql, pode dar m.

O pool é necessário mais quando há problema de latência com o servidor de banco, caso contrário pode acabar ocupando o banco em momentos que não está sendo usado por uma ou n aplicações.

Bom dia Lucas.
Cara não sei se entendi muito bem, me corrija se responder besteira, mas a maioria das transações não fiz tratamento, somente algumas delas que precisava garantir que todas as transações fossem realizadas eu utilizei o Transaction.

Bom dia Javaflex, eu vou dar uma olhada no link que postou e verificar a conexão com o banco, mas com certeza o timeout do banco esta menor que o do C3P0. Acha melhor sincronizar os dois Timeouts?

Faz um teste deixando o timeout do pool pelo menos 1 minuto menor que o timeout do MySql. Diminui o max_size também de acordo com sua demanda real.