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

NÃO ABRE NOVAS CONEXÕES

Quando executo o programa o console me informa a abertura das conexões porém não consigo ver no MySql.

import java.sql.Connection;
import java.sql.SQLException;

public class TestaPool {

    public static void main(String[] args) throws SQLException {

        ConnectionFactory con = new ConnectionFactory();
        for (int i = 1; i < 5; i++) {
            con.recuperaConexao();
            System.out.println(i);

        }




    }

}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.sql.ConnectionPoolDataSource;
import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class ConnectionFactory {

    public DataSource dataSource;

    public ConnectionFactory() {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost/loja_virtual?useTimezone=true&serverTimezone=UTC");
        comboPooledDataSource.setPassword("7m75bC9@5rmr");
        comboPooledDataSource.setUser("root");
        comboPooledDataSource.setMaxPoolSize(5);
    //    comboPooledDataSource.setMaxConnectionAge(10);
        this.dataSource = comboPooledDataSource;
    }

    Connection recuperaConexao() throws SQLException {

            //System.out.println("Conexão OK");
            return this.dataSource.getConnection();


    }

    void fechaConexao() throws SQLException {
        this.dataSource.getConnection().close();
    }
}
7 respostas

Maurício, bom dia. Pelo que eu entendi, você quer ver as conexões abertas no mysql, certo? Para isso, é possível executar esse comando no próprio mysql show processlist

Exato João. Já fiz isso. Acontece que abri 4 conexões e no MySql consta como se não houvessem conexões abertas

Maurício, bom dia. Você consegue fazer as operações no banco a partir da aplicação?

Consigo normalmente.

+----+-----------------+-----------------+--------------+---------+--------+------------------------+------------------+
| Id | User            | Host            | db           | Command | Time   | State                  | Info             |
+----+-----------------+-----------------+--------------+---------+--------+------------------------+------------------+
|  4 | event_scheduler | localhost       | NULL         | Daemon  | 174951 | Waiting on empty queue | NULL             |
| 57 | root            | localhost:54036 | loja_virtual | Query   |      0 | starting               | show processlist |
+----+-----------------+-----------------+--------------+---------+--------+------------------------+------------------+

Esta é a saída do prompt de comando quando executo um show processlist

Oi Mauricio, tenta guardar as conexões e travar a execução para dar tempo para ver o pool funcionando. Algo assim, no seu método main:

public static void main(String[] args) throws Exception {

    List<Connection> connections = new ArrayList<>();
        ConnectionFactory con = new ConnectionFactory();

        for (int i = 1; i < 5; i++) {
            connections.add(con.recuperaConexao());
            System.out.println(i);
        }

    Thread.sleep(30000); //30s
 }

Apos rodar, vc precisa executar o comando show processlist dentro de 30s.

Abs

Obrigado Nico, funcionou. Por que o código do instrutor funcionou mesmo sem a sua sugestão ?

solução!

Essa é uma boa pergunta :) eu imagino que o pool de conexão nao fechava corretamente as conexões quando o instrutor estava executando o teste durante a gravação e assim ficaram abertas mesmo com a aplicação Java já terminada ... mas é um chute.

abs