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

Connection Pool para o PostgreSQL

Boa tarde.

Estou tentando desenvolver meu projeto com o PostgreSQL, e não sei se implementei de forma correta, pois a implementação do driver que utilizei: Jdbc3ConnectionPool, não extende do DataSource :/ Seria essa a implementação correta? Minha classe database está correta da forma que eu implementei? Obrigado!

Ps. procurei algum tópico que já possuísse essa dúvida da implementação do postgreSQL mas não encontrei.

valeu!

package br.com.pessoal.jdbc.db;

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

import org.postgresql.jdbc3.Jdbc3ConnectionPool;

public class Database {

    private static Connection connection;
    private static Jdbc3ConnectionPool dataSource;

    private static void createConnectionPool(){        
        Jdbc3ConnectionPool pool = new Jdbc3ConnectionPool();
        pool.setUrl("jdbc:postgresql://localhost/alura");
        pool.setUser("postgres");
        pool.setPassword("postgres");
        dataSource = pool;
    }


    public static Connection getConnection() throws SQLException{        

        if(dataSource == null){
            createConnectionPool();
        }

        if(connection == null || connection.isClosed()){
            //connection = DriverManager.getConnection("jdbc:postgresql://localhost/alura", "postgres", "postgres");            
            connection = dataSource.getConnection();
            //connection.setAutoCommit(false);
        }

        return connection;

    }


}
4 respostas

Oi Luis tudo bem ?

Cara você pode usar um pattern de criação, que é o Factory e como ele vai criar conexões podemos chamar de conexão factory.

public class ConnectionFactory {
    public Connection getConnection() {
        try {
            return DriverManager.getConnection(
          "jdbc:postgresql://localhost/alura", "postgres", "postgres");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

Que já resolveria seu problema !

E você também pode fazer com que o método seja estático.

Espero ter ajudado !

Olá Matheus, obrigado pela resposta. Acho que não fui muito claro na minha dúvida.

Eu consegui implementar a classe de criar Conexões tudo OK. Meu problema está sendo na aula 5: Connection Pool e Datasources, onde temos que transformar nosso método getConnection() em um Pool de Conexões.

Segundo a explicação da aula, todo driver de conexão jdbc possui uma classe para implementar o Pool de Conexão, e essa classe extende do sql.DataSource. O problema é que não encontrei no PostgreSQL qual é a essa classe, pois a que estou utilizando (org.postgresql.jdbc3.Jdbc3ConnectionPool) não extende do datasource, impedindo que eu prossiga sem fazer as "gambiarras" acima.

Enfim, como não consegui extender do DataSource, não sei se estou utilizando o pool de conexões ou não :/

solução!

Oi Luis, tudo bem ?

A classe que você quer é PGPoolingDataSource !

Cara desculpa, acabei de dar uma olhadinha na documentação do Postgre :

https://jdbc.postgresql.org/documentation/head/datasource.html

Dá uma olhadinha ai, isso vai te ajudar.

Abraços :D

Olá Matheus, Muito obrigado, a documentação que você enviou foi perfeita.

Segunda a documentação, a Classe que implementa o dataSource no PostgreSQL é a org.postgresql.ds.PGConnectionPoolDataSource, mas ela não implementa diretamente a sql.dataSource, e sim a javax.sql.ConnectionPoolDataSource. Tem essa pequena diferença com o exemplo da aula.

Sendo assim, foi necessário utilizar o método dataSource.getPooledConnection().getConnection().

Segue meu código final: Obrigado pela ajuda!

package br.com.pessoal.jdbc.db;

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

import org.postgresql.ds.PGConnectionPoolDataSource;

public class Database {

    private static Connection connection;
    private static javax.sql.ConnectionPoolDataSource dataSource;

    private static void createConnectionPool(){        

        PGConnectionPoolDataSource pool = new PGConnectionPoolDataSource();
        pool.setUrl("jdbc:postgresql://localhost/alura");
        pool.setUser("postgres");
        pool.setPassword("postgres");
        dataSource = pool;
    }


    public static Connection getConnection() throws SQLException{        

        if(dataSource == null){
            createConnectionPool();
        }

        if(connection == null || connection.isClosed()){
            //connection = DriverManager.getConnection("jdbc:postgresql://localhost/alura", "postgres", "postgres");            
            connection = dataSource.getPooledConnection().getConnection();
            //connection.setAutoCommit(false);
        }

        return connection;

    }


}