Java.lang.NullPointerException ao usar pool de conexões PGSQLPOOL

10 respostas Resolvido
postgresqljavaconection
Spirik

Bom dia!
Estou passando por alguns problemas ao tentar usar o pool de conexões PGSQLPOOL. Eu usava uma fábrica de conexões para me conecta ao banco, mas conforme o software que estou desenvolvendo ficava maior, ele ficava também mais lento por conta de múltiplas conexões abertas e nenhuma delas fechava! Então decidi migrar para um pool de conexões, porém, ao migrar de um para outro, não consigo mais puxar dados do banco… Todos os meus DAOs me retornam com um NullPointerException. Vou postar o meu pool e um de meus DAOs aqui para que vcs possam dar uma olhadinha :smiley. Segue o Código:

Pool:

package util;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.swing.JOptionPane;

import org.postgresql.ds.PGPoolingDataSource;

public class ConnectionFactory {

public static ConnectionFactory myInstance;
private static Connection connection = null;
PGPoolingDataSource source = new PGPoolingDataSource();

private ConnectionFactory() {
    source.setURL("jdbc:postgresql://localhost/comercio_bd");
    source.setDataSourceName("PGSQLPOOL");
    source.setServerName("127.0.0.1");
    source.setPortNumber(5432);
    source.setDatabaseName("comercio_bd");
    source.setUser("postgres");
    source.setPassword("");
    source.setMaxConnections(10);
}

public Connection getConnection() throws SQLException {
    try {

        if (connection == null) {
            connection = source.getConnection();
        }

    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, e.getMessage(), "Ops!", JOptionPane.ERROR_MESSAGE);
    }
    return connection;
}

public static ConnectionFactory getInstance() {
    if (myInstance == null) {
        myInstance = new ConnectionFactory();
    }
    return myInstance;
}

}`

DAO (Todos têm essa estrutura):
package DAO;

import com.sun.scenario.effect.impl.prism.PrCropPeer;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import javax.swing.JOptionPane;

import model.Fornecedor;

import model.Produto;

import model.Preco;

import util.ConnectionFactory;

import view.TelaDeCadastro;

import view.TelaPesquisas;
public class ProdutoDAO {

private Connection con;
ConnectionFactory conf;

public ProdutoDAO() throws Exception {
    try {
        con = conf.getConnection();
    } catch (Exception e) {
        throw new Exception(e.getMessage());
    }
}

public void Salvar(Produto p, Preco pr) throws Exception {

    PreparedStatement ps = null;
    PreparedStatement ps2 = null;
    if (p == null) {
        throw new Exception("Erro: Produto não pode ser nulo!");
    }
    try {

        try {
            String sql2 = "insert into tbl_preco (id_preco,preco_custo, margem_lucro, preco_venda,preco_aprazo,preco_avista,preco_promocional)"
                    + " values (NEXTVAL('sequencia_preco'),?,?,?,?,?,?)";

            ps2 = this.con.prepareStatement(sql2);
            ps2.setDouble(1, pr.getPrecoCusto());
            ps2.setDouble(2, pr.getMargemLucro());
            ps2.setDouble(3, pr.getPrecoVenda());
            ps2.setDouble(4, pr.getPrecoAprazo());
            ps2.setDouble(5, pr.getPrecoAvista());
            ps2.setDouble(6, pr.getPrecoPromocional());

            String sql = "insert into tbl_produto (id_produto, codigo_barras, descricao_produto,unidade_de_medida"
                    + ",localizacao_fisica,fk_fornecedor,fk_preco,fk_tipo_produto,flag_ativo,fk_marca, qtd_produto) values "
                    + "(NEXTVAL('sequencia_produto'),?,?,?,?,?,CURRVAL('sequencia_preco'),?,1,?,?)";

            ps = this.con.prepareStatement(sql);
            ps.setString(1, p.getCodigoDeBarrasProduto());
            ps.setString(2, p.getDescricaoProduto());
            ps.setString(3, p.getUnidadeDeMedidaProduto());
            ps.setString(4, p.getLocalizacaoFisicaProduto());
            ps.setInt(5, p.getFornecedorProduto().getIdFornecedor());
            ps.setInt(6, p.getTipoProduto().getIdTipo());
            ps.setInt(7, p.getNarca().getIdMarca());
            ps.setInt(8, p.getQuantidade());

            ps2.executeUpdate();
            ps2.close();
            ps.executeUpdate();
            ps.close();

        } catch (Exception e) {
            throw new Exception("Erro ao inserir os dados!(ProdutoDAO)" + e.toString());
        }
    } finally {
        try { con.close(); } catch (SQLException e) {JOptionPane.showMessageDialog(null, "Erro ao fachar conexão:"+e.getMessage(), "Ops!", JOptionPane.ERROR_MESSAGE);}
    }

}

public void Atualizar(Produto p) throws Exception {

    PreparedStatement ps = null;

    if (p == null) {
        throw new Exception("Erro: Produto não pode ser nulo!");
    }
    try {

        try {
            String sql = "update tbl_produto set codigo_barras=?, descricao_produto=?,unidade_de_medida=?,localizacao_fisica=?";

            ps = this.con.prepareStatement(sql);
            ps.setString(1, p.getCodigoDeBarrasProduto());
            ps.setString(2, p.getDescricaoProduto());
            ps.setString(3, p.getUnidadeDeMedidaProduto());
            ps.setString(4, p.getLocalizacaoFisicaProduto());

            ps.executeUpdate();

        } catch (Exception e) {
            throw new Exception("Erro ao atualizar os dados!" + e.getMessage());
        }
    } finally {
        try { con.close(); } catch (SQLException e) {JOptionPane.showMessageDialog(null, "Erro ao fachar conexão:"+e.getMessage(), "Ops!", JOptionPane.ERROR_MESSAGE);}
    }

}

public void Deletar(Produto p) throws Exception {

    PreparedStatement ps = null;

    if (p == null) {
        throw new Exception("Erro: Produto não pode ser nulo!");
    }
    try {

        try {
            String sql = "update tbl_produto set flag_ativo=0";

            ps = this.con.prepareStatement(sql);

            ps.executeUpdate();

        } catch (Exception e) {
            throw new Exception("Erro ao Deletar os dados!" + e.getMessage());
        }
    } finally {
        try { con.close(); } catch (SQLException e) {JOptionPane.showMessageDialog(null, "Erro ao fachar conexão:"+e.getMessage(), "Ops!", JOptionPane.ERROR_MESSAGE);}
    }
}

public ArrayList<Produto> ConsultaProduto() throws Exception {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Produto> listaproduto = new ArrayList<>();
    try {

        try {


            String sql = "select prod.codigo_barras, prod.descricao_produto, prod.qtd_produto, prod.localizacao_fisica, "
                    + "pr.preco_custo, pr.preco_venda, forn.nome_empresa from tbl_produto prod inner join tbl_fornecedor forn on "
                    + "prod.fk_fornecedor = forn.id_fornecedor inner join tbl_preco pr on prod.fk_preco = pr.id_preco where prod.flag_ativo=1";

            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                Produto p = new Produto();
                Preco pr = new Preco();
                Fornecedor f = new Fornecedor();

                f.setNomeEmpresa(rs.getString("nome_empresa"));
                pr.setPrecoCusto(rs.getDouble("preco_custo"));
                pr.setPrecoVenda(rs.getDouble("preco_venda"));
                p.setCodigoDeBarrasProduto(rs.getString("codigo_barras"));
                p.setDescricaoProduto(rs.getString("descricao_produto"));
                p.setLocalizacaoFisicaProduto(rs.getString("localizacao_fisica"));
                p.setQuantidade(rs.getInt("qtd_produto"));
                p.setPrecoProduto(pr);
                p.setFornecedorProduto(f);
                listaproduto.add(p);
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar os dados dos Produtos!" + e.toString(), "Ops!", JOptionPane.ERROR_MESSAGE);
        }
    } finally {
        try { con.close(); } catch (SQLException e) {JOptionPane.showMessageDialog(null, "Erro ao fachar conexão:"+e.getMessage(), "Ops!", JOptionPane.ERROR_MESSAGE);}
    }
    return listaproduto;
}

}

Pilha de erros:

run:

mar 26, 2018 8:51:32 AM view.TelaDeCadastro 

GRAVE: null

java.lang.Exception

at DAO.TipoProdutoDAO.(TipoProdutoDAO.java:32)

at view.TelaDeCadastro.InserirDadosComboTipo(TelaDeCadastro.java:1727)

at view.TelaDeCadastro.(TelaDeCadastro.java:42)

at view.Retaguarda$8.actionPerformed(Retaguarda.java:421)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)

at java.awt.Component.processMouseEvent(Component.java:6533)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)

at java.awt.Component.processEvent(Component.java:6298)

at java.awt.Container.processEvent(Container.java:2236)

at java.awt.Component.dispatchEventImpl(Component.java:4889)

at java.awt.Container.dispatchEventImpl(Container.java:2294)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)

at java.awt.Container.dispatchEventImpl(Container.java:2280)

at java.awt.Window.dispatchEventImpl(Window.java:2746)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)

at java.awt.EventQueue.access$500(EventQueue.java:97)

at java.awt.EventQueue$3.run(EventQueue.java:709)

at java.awt.EventQueue$3.run(EventQueue.java:703)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)

at java.awt.EventQueue$4.run(EventQueue.java:731)

at java.awt.EventQueue$4.run(EventQueue.java:729)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Seria a Estrutura do DAO diferente com um pool de conexões? Ou seria a mesma? O que eu precisei mudar nos DAOs foi como chamar a conexão que antes eu fazia assim con = ConnectionFactory.GetConnection()
e agora é como vcs vêm acima no DAO. Se alguém puder me ajudar, eu e minha equipe ficareos mt agradecidos!

10 Respostas

darlan_machado

O que tem nesta linha?

Spirik

isso:

public TipoProdutoDAO() throws Exception {
    try {
        con = conf.getConnection();
    } catch (Exception e) {
        throw new Exception(e.getMessage());
    }
}

Esse é o construtor do DAO, todos têm um igual… e eu tenho 32 DAOs aqui

darlan_machado

Ok, mas qual a linha 32?

Se for isso

Você precisa rever a classe que gera o arquivo conf e o método getConnection

Spirik

A linha 32 é essa XD

throw new Exception(e.getMessage());
darlan_machado

Bom, é óbvio que ela lança a exceção.
Como o único trecho de código dentro desse bloco é esse

con = conf.getConnection();

Sugiro fazer o que disse acima.

Spirik

então cara, eu fiquei revendo essa classe a manhã td e não consegui ver pq essa conexão está nula! Eu inclusive mandei ela acima (ConnectionFactory)

darlan_machado
Solucao aceita

Cara, o problema não está no método getConnection, nem na classe ConnectionFactory, o problema é que você não instancia, em nenhum lugar, o objeto conf. Como você tenta invocar o método getConnection, isso gera o NPE.

Spirik

Nossa cara nem tinha reparado! Vou correndo testar e volto com a resposta!

Spirik

Cara, funcionou! Foi Palhaçada minha msm RSRS. Muito Obrigado!

darlan_machado

Uma das coisas com as quais temos que nos acostumar é a aceitar nossas falhas. Erramos, é natural do ser humano.
Por isso code review é algo muito bom a ser feito.

Criado 26 de março de 2018
Ultima resposta 26 de mar. de 2018
Respostas 10
Participantes 2