Pool do Hibernate quebrando minhas conexoes

oi pessoal

deixo a aplicacao rondado umas 24 horas, e ai comeca:

Caused by: java.sql.SQLException: Communication link failure: java.net.SocketException
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:882)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:945)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:1809)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1458)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:179)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:179)
        at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:83)
        at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:790)
        at net.sf.hibernate.loader.Loader.doQuery(Loader.java:184)
        at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:128)
        at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:826)
        at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:846)
        at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:57)
        at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:49)
        at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:420)
        ... 51 more

eh tipo quando a conexao esta quebrada, fechada por timeout sabe? mas nao me parece ser a mesm a coisa

a connection string:

 jdbc:mysql://localhost/cobra?autoReconnect=true&
useUnicode=true&characterEncoding=UTF8

o driver eh o novo, 3.0.blah.

o autoreconnect deveria justo impedir esse tipod e quebra.

se eu booto o connection pool (na verdade a webapp itneira) resolve.

dicas?

paulo, vc está usando o pool do próprio hibernate?

já tentou usar o C3P0 ou o DBCP ?

ricardo!
to usando dbcp, vou tentar outro
saca soh:

## connection pool

hibernate.dbcp.maxActive 10
hibernate.dbcp.whenExhaustedAction 1
hibernate.dbcp.maxWait 120000
hibernate.dbcp.maxIdle 10

## prepared statement cache

hibernate.dbcp.ps.maxActive 100
hibernate.dbcp.ps.whenExhaustedAction 1
hibernate.dbcp.ps.maxWait 120000
hibernate.dbcp.ps.maxIdle 100

## optional query to validate pooled connections:

#hibernate.dbcp.validationQuery select 1 from dual
hibernate.dbcp.testOnBorrow true
#hibernate.dbcp.testOnReturn false

Paulo voce tem que definir uma validation query, sem ela o dbcp não valida direito a conecção.

veja este post no forum do hibernate:

http://forum.hibernate.org/viewtopic.php?t=442&highlight=c3p0

como vc viu o gavin indica usar o c3p0, nao que este seja seu problema, acredito que nao… mas vale a pena tentar…

o que eu li no forum do hibernate é assim:

1 - usar o pool do hibernate: nao! somente em testes e nunca em produçao.

2 - qual usar? c3p0.

3 - Mas o mais indicado é usar uma datasource do seu appserver e deixar seu servidor cuidar do pool…

eu configurei aqui no websphere com oracle e vou deixar uns dias para ver como se comporta…

bem, me parece q estou com o mesmo problema, e nao estou conseguindo resolver

infelizmente nao sei oq eh pool e nem pra q serve, alguem poderia explicar e como resolveram isso?

Paulo esse é um bug do mysql

da uma olhada aqui http://bugs.mysql.com/bug.php?id=1202

Você não deveria usar a propriedade autoReconnect=true por que ela não é recomendada pelo proprio fabricante

você pode usar o autoReconnectForPools=true

da uma olhada abaixo
http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

outra coisa provavelmente esse erro ocorre por que seu servidor deve estar com o tempo maximo de conexão baixo (exemplo 8 horas q é o default)

espero que ajude

Quanto a as implementações de pool eu sempre usei o dbcp realmente ele tem algumas deficiências mas o C3P0 (ou C3PO :P) quase não tem documentação e nem uma comunidade ativa o mantendo ou contribuindo

posso estar errado mas não conheço nenhum site oficial alem desse abaixo

se eh bug do mysql não há oq fazer entao? o meu programa nao chega a ficar 8 horas pra ficar extremamente lento como se perdesse a conexao, basta apenas duas horas

esse autoReconnectForPools=true pode resolver?

O mysql tem uma diretiva de configuracao que estipula o tempo maximo de vida da conexao. O default é 8 horas.

No seu caso, experimente sim o autoReconnectForPools=true

Rafael

seguinte,e ele so fica meia hora parado pra ficar lento

e outra, se a pessoa ficar atualizando e consultando a memoria consumida vai aumentando(era pra quando ele fechar a janela librar a memoria q foi utilizada da consulta ou atualização), e quanto estora a memoria(que eh de 512mb) fica bastante lento, tem como contornar isso?

Sim, arrumando os memory leaks da tua app :P. Voce nao deve estar fehcnado conexoes, result sets e afins. Pode ser um cache mail feito tambem.

Utilize um profiler para avariguar melhor.

Rafael

estou fechando as conexoes sim, pq tive um problema de nao atualizar os dandos, e pesquisei sobre isso e vi q era pq nao estava fechando as minhas conexoes, e fiz isso e consertou, agora os meus result sets nao, como faco isso?

e oq mais devo fechar?
e oq eh memory leaks?

estou pesquisano sobre isso jah, mas postar aq ajudaria MT, mt obg

Statements e ResultSets tem um metodo close() tambem.

Rafael

ok, obg pela ajuda

ja sei oq eh memory leaks e estou tentando fazer alguns ajustes no meu programa quanto a isso

agora tenho uma duvida

quando dou dispose(); em uma janela, todos os objetos dela nao vao ser coletados pelo gc nao? mesmo sem ser componentes swing?

Desculpa, parei de ver o topico ainda bem o Rafael ja ajudou :slight_smile: