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

connection pool em mysql

Boa noite,

Prezados, estou seguindo o curso de JDBC mas usando o Mysql. não consegui encontrar na internet como fazer um pool de conexões como o exibido no curso (em HSQLDB), na aula 05. poderiam me ajudar?

4 respostas

consegui encontrar uma solução, mas não sei se realmente utilizei um pool de conexões, pois no Mysql nao passou das 4 conexões abertas (que ele já mantem por padrão):

em vez do

JDBCPool pool = new JDBCPool()

utilizei o

MysqlDataSource pool = new MysqlDataSource();

solução!

Olá, Luiz!

A classe MysqlDataSource não é para pool de conexões. É somente a classe de datasource do MySQL.

A clase JDBCPool é feita exclusivamente para o HSQLDB como você percebeu. O MySQL não tem uma classe dessas por padrão em suas bibliotecas, mas há outras duas bibliotecas muito famosas que são utilizadas para isso: Apache DBCP e C3P0.

Tem várias outras bibliotecas para isso, mas essas duas são bastante confiáveis. Inclusive, a C3P0 é muito utilizada junto com Hibernate.

Para utilizá-las, é bastante simples o processo. Você deve fazer o download do(s) jar(s) necessários no site deles e colocar no seu projeto.

Segue um código de exemplo de cada:

Apache DBCP

import java.sql.*;
import org.apache.commons.dbcp.*;

public class C3POPConnectionExample {
    public static void main(String args[]) throws Exception {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("root");
        dataSource.setPassword("");
        dataSource.setInitialSize(1);
        Connection con = dataSource.getConnection();
        System.out.println("Connection Object information : " + con);
    }
}

C3P0

import java.sql.*;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBCPConnectionExample {
    public static void main(String args[]) throws Exception {
        ComboPooledDataSource connectionPoolDatasource = new ComboPooledDataSource();
        connectionPoolDatasource.setDriverClass("com.mysql.jdbc.Driver");
        connectionPoolDatasource.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
        connectionPoolDatasource.setUser("root");
        connectionPoolDatasource.setPassword("");
        connectionPoolDatasource.setMinPoolSize(1);
        connectionPoolDatasource.setAcquireIncrement(5);
        connectionPoolDatasource.setMaxPoolSize(20);
        Connection con = connectionPoolDatasource.getConnection();
        System.out.println("Connection Object information : " + con);
    }
}

Ajudou?

obrigado.

ajudou sim. :)

Bacana, estou implementando um Pool com Mysql também, o que notei foi um log de INFO que estava meio feio, resolvi tirar e ficou assim:

package com.alura.Database;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class MySql{

    private ComboPooledDataSource dataSource;

    public MySql(){
        Properties properties = new Properties();
        properties.setProperty("user", "root");
        properties.setProperty("password", "123456");
        properties.setProperty("useSSL", "false");
        properties.setProperty("autoReconnect", "true");
        properties.setProperty("serverTimezone", "UTC");

        //Log WARNING
        System.setProperty("com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL", "WARNING");
        System.setProperty("com.mchange.v2.log.MLog", "com.mchange.v2.log.FallbackMLog");

        ComboPooledDataSource connectionPoolDatasource = new ComboPooledDataSource();
        connectionPoolDatasource.setJdbcUrl("jdbc:mysql://localhost:3306/loja-virtual");
        connectionPoolDatasource.setMinPoolSize(1);
        connectionPoolDatasource.setAcquireIncrement(1);
        connectionPoolDatasource.setMaxPoolSize(10);
        connectionPoolDatasource.setProperties(properties);

        this.dataSource = connectionPoolDatasource;
    }

    public Connection getConnection() throws SQLException{
        Connection con = dataSource.getConnection();
        con.setAutoCommit(false);
        return con;
    }
}
package com.alura;

import com.alura.Database.MySql;

import java.sql.*;

public class MysqlTest
{
    public static void main( String[] args ) throws SQLException
    {
        MySql database = new MySql();
        for (int i = 0; i < 100; i++) {
            Connection connection = database.getConnection();

            String sql = "INSERT INTO TESTE (teste) VALUES (?)";
            //String sql = "DELETE FROM TESTE WHERE id > ?";

            try(PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
                adiciona("Testando123", statement);
                //deleta(3, statement);
                System.out.println("Commit efetuado com sucesso");
                connection.commit();
            } catch (Exception ex) {
                ex.printStackTrace();
                connection.rollback();
                System.out.println("Rollback efetuado");
            }
        }
    }

    private static void deleta(int teste, PreparedStatement statement) throws SQLException {
        statement.setInt(1, teste);
        boolean resultado = statement.execute();
    }

    private static void adiciona(String teste, PreparedStatement statement) throws SQLException {
        statement.setString(1, teste);
        boolean resultado = statement.execute();
        ResultSet rs = statement.getGeneratedKeys();
        while (rs.next()){
            System.out.println("id gerado: " + rs.getInt(1));
        }
        rs.close();
    }
}