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!