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?
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?
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();
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();
}
}