DBCP ou C3PO

4 respostas
B

Olá, tenho uma aplicação web que usa Hibernate + Spring + MySql.

Dentre as várias funções, existe uma que utiliza o framework Quartz para fazeragendamento de busca no banco e envio de e-mail. Mais precisamente: utilizo o quartz para busca alguns dados no banco e enviar tais dados via e-mail a cada 1 hora.
Há meses tudo funcionava perfeitamente até que fizeram uma atualização no servidor e mudaram o MySql do 5.1 para o 5.5. Desde então reparei que as vezes o e-mail que chega, vem com uma mensagem de erro setada no código.

Fui verificar e descobri que as vezes a aplicação simplesmente não consegue se conectar ao banco. E o pior é que não existe nenhum tipo de situação padrão pra isso ocorrer, as vezes funciona e as vezes não.

segue o stacktrace:
org.hibernate.exception.JDBCConnectionException: Cannot open connection
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
	at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
	at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
	at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700)
	at org.hibernate.loader.Loader.doQuery(Loader.java:801)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
	at org.hibernate.loader.Loader.doList(Loader.java:2533)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
	at org.hibernate.loader.Loader.list(Loader.java:2271)
	at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
	at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
	at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
	at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
	at br.com.ernet.superpaymonitor.dao.TransacaoDAO.buscaTransacoes(TransacaoDAO.java:27)
	at br.com.ernet.superpaymonitor.business.TransacaoBusiness.execute(TransacaoBusiness.java:41)
	at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 59.378 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
	at sun.reflect.GeneratedConstructorAccessor39.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3589)
	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3478)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4019)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)
	at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5030)
	at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
	at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:83)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
	... 16 more
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
	at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3039)
	at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3489)
	... 25 more

pesquisei e descobri que pode ser algo relacionado à configuração do c3po, mas apesar de já fazer várias mudanças, o erro continua ocorrendo..Descobri tmb que existe algo chamado de DBCP que funciona como o c3po e aparentemente é melhor.....alguém confirma isso? Alguém sabe qualquer dica que possa me ajudar a resolver esse problema?

Agradeço desde já

4 Respostas

R

Kd os arquivos de configuração da aplicação?

B

somente a parte do c3po…

era esse:

<property name="hibernate.c3p0.acquire_increment">1</property> <property name="hibernate.c3p0.idle_test_period">100</property> seconds <property name="hibernate.c3p0.max_size">48</property> <property name="hibernate.c3p0.max_statements">10</property> <property name="hibernate.c3p0.min_size">10</property> <property name="hibernate.c3p0.timeout">100</property> seconds

agora troquei por esse e estou testando:

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.acquire_increment">3</property> <property name="hibernate.c3p0.idle_test_period">14400</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">75</property> <property name="hibernate.c3p0.max_statements">0</property> <property name="hibernate.c3p0.timeout">25200</property> <property name="hibernate.c3p0.preferredTestQuery">select 1</property> <property name="hibernate.c3p0.testConnectionOnCheckout">true</property>

romarcio

Na url de conexão com o mysql, adicona a propriedade autoReconect=true, faz esse teste.

"jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true"
ganondorfan

Tente descobrir o número máximo de conexões abertas com o banco de dados, ultimo servidor que hospedei minha aplicação tinha um limite de 40 conexões simultâneas, para resolver meu problema implementei meu próprio Pool de Conexões.

Criado 11 de junho de 2012
Ultima resposta 11 de jun. de 2012
Respostas 4
Participantes 4