Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Pool conexão C3P0 perde comunicação após 8h

Boa noite,

Criei um pool de conexões utilizado com.mchange.v2.c3p0.ComboPooledDataSource para acessar o mysql. Está funcionando certinho, mas sempre que não acesso a aplicação por aproximadamente 8h, ao fazer o primeiro login o sistema apresenta a seguinte exceção:

The last packet successfully received from the server was 29,398,989 milliseconds ago.  The last packet sent successfully to the server was 10 milliseconds ago."
java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key Communications link failure

Ainda não consegui encontrar uma solução. (configuração adequada) Segue o meu código da minha classe C3P0DataSource.java

private static C3P0DataSource dataSource;     
 private ComboPooledDataSource comboPooledDataSource;

 private C3P0DataSource() throws PropertyVetoException {

         this.comboPooledDataSource = new ComboPooledDataSource();
         this.comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");         this.comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/BD");

          this.comboPooledDataSource.setUser("usuario");
         this.comboPooledDataSource.setPassword("senha");     
         this.comboPooledDataSource.setMaxPoolSize(30);
         this.comboPooledDataSource.setMinPoolSize(10);
         this.comboPooledDataSource.setInitialPoolSize(10);
         this.comboPooledDataSource.setIdleConnectionTestPeriod(300);
        this.comboPooledDataSource.setTestConnectionOnCheckin(true);
         this.comboPooledDataSource.setMaxIdleTimeExcessConnections(240);
     }  

     public static C3P0DataSource getInstance() throws PropertyVetoException {
          if (dataSource == null)
             dataSource = new C3P0DataSource();
          return dataSource;
       }

       public Connection getConnection() throws SQLException  { 
            return comboPooledDataSource.getConnection();        
       }

Obrigado

5 respostas

Oi Maikel,

essa sua aplicação está rodando onde exatamente? Seu banco de dados está em outro server?

Abraços

Oi Fábio,

Está num ambiente criado na locaweb com ip's diferentes (servidor de aplicação e banco de dados).

Importante: Eu fiz o teste na minha máquina e apresenta o mesmo problema, ou seja, eu faço o login, logoff, modifico a data do meu computador (adianto alguns dias) e tento fazer login novamente, então apresenta esse erro.

Obrigado

Você tem fechado as suas conexões tb?

Esse erro normalmente acontece porque você está mantendo referências de conexões mas o banco de dados tem um timeout na conexão de 8 horas.

Aparentemente você não está configurando isso pelo pool e aí qdo vc adianta a hora o banco já matou a conexão, mas a referência está lá ainda, apontando pra uma conexão fechada.

Você poderia tentar algo assim:

<property name="c3p0.timeout">100</property> <!-- seconds -->
solução!

Oi Fábio,

Eu estou testando uma solução parecida com essa sua.

/*Segundos que uma Conexão será mantida no pool sem ser usada, antes de ser
descartada. Zero significa que a conexão nunca expira.*/
 this.comboPooledDataSource.setMaxIdleTime(60*60*6);

Aparentemente tem funcionado.

Você tem alguma objeção sobre essa solução? Num caso negativo eu vou aplicar ela mesmo.

Muito obrigado pela ajuda.

Show aparentemente funciona sim. :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software