Método con.close(); não retorna conexão ao pool

Boa Tarde, Estou tendo alguns problemas ao tentar retornar algumas conexões ao meu pool de conexões.
Era para elas fecharem, mas não estão fechando, mesmo que eu chame o con.close(); em meu finally! Não tem nem pilha de erros! Vou mandar minha classe de conexão para vcs dare um olhadela:
package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.ConnectionPoolDataSource;
import javax.swing.JOptionPane;
import jdk.nashorn.internal.objects.NativeRegExp;
import org.postgresql.ds.PGConnectionPoolDataSource;
import org.postgresql.ds.PGPoolingDataSource;
import org.postgresql.jdbc2.optional.PoolingDataSource;

public class ConnectionFactory {

public static ConnectionFactory myInstance;
private static Connection connection = null;
private static ConnectionPoolDataSource datasource;

public ConnectionFactory() {
    
}

public static void DefineConexao (){
    PGConnectionPoolDataSource source = new PGConnectionPoolDataSource();
    source.setURL("jdbc:postgresql://localhost/comercio_bd");
    //source.setDataSourceName("PoolTecSoft");
    source.setServerName("127.0.0.1");
    source.setPortNumber(5432);
    source.setDatabaseName("comercio_bd");
    source.setUser("postgres");
    source.setPassword("");        
    datasource = source;
}


public Connection getConnection() throws SQLException {
    try {

        if (connection == null) {
            DefineConexao();
        }
        if(connection == null || connection.isClosed()){
            connection = datasource.getPooledConnection().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;
}

public void Close(){
    
    
    
}

}

Segue um dos meus DAOs (tenho cerca de 32 prontos, vou mandar o de Fornecedores):

        i/*
  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */
    package DAO;

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.EnderecoFornecedor;
import model.Fornecedor;
import model.Funcionario;
import model.TelefoneFornecedor;
import util.ConnectionFactory;

/**
*

  • @author Rafael
    */
    public class FornecedorDAO {

    TelefoneFornecedorDAO tel = new TelefoneFornecedorDAO();
    EnderecoFornecedorDAO end = new EnderecoFornecedorDAO();
    private Connection con;

    public FornecedorDAO() throws Exception {
    try {
    con = ConnectionFactory.getInstance().getConnection();
    } catch (Exception e) {
    throw new Exception(e.getMessage());

}
}

public void Salvar(Fornecedor f, TelefoneFornecedor t, EnderecoFornecedor end) throws Exception {
    PreparedStatement ps = null;
    PreparedStatement ps2 = null;
    PreparedStatement ps3 = null;

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

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            String sql2 = "insert into tbl_telefone_fornecedor(id_telefone_fornecedor, telefone_fixo_fornecedor, celular1_fornecedor, celular2_fornecedor,flag_ativo)"
                    + "values (NEXTVAL('sequencia_telefone_fornecedor'),?,?,?,1)";
            ps2 = this.con.prepareStatement(sql2);

            String sql3 = "insert into tbl_endereco_fornecedor(id_endereco_fornecedor,cidade_fornecedor,cep_fornecedor,estado_fornecedor,bairro_fornecedor,rua_fornecedor,numero_fornecedor,flag_ativo)"
                    + " values (NEXTVAL('sequencia_endereco_fornecedor'),?,?,?,?,?,?,1)";
            ps3 = this.con.prepareStatement(sql3);

            String sql = " insert into tbl_fornecedor(id_fornecedor,nome_empresa,cnpj,ie,email,fk_telefone_fornecedor,fk_endereco_fornecedor,flag_ativo)"
                    + "values (NEXTVAL('sequencia_fornecedor'),?,?,?,?, CURRVAL('sequencia_telefone_fornecedor'),CURRVAL('sequencia_endereco_fornecedor'),1)";
            ps = this.con.prepareStatement(sql);

            ps2.setString(1, t.getTelefoneFixo());
            ps2.setString(2, t.getCelular1());
            ps2.setString(3, t.getCelular2());

            ps3.setString(1, end.getCidade());
            ps3.setString(2, end.getCep());
            ps3.setString(3, end.getEstado());
            ps3.setString(4, end.getBairro());
            ps3.setString(5, end.getRua());
            ps3.setString(6, end.getNumero());

            ps.setString(1, f.getNomeEmpresa());
            ps.setString(2, f.getCnpjEmpresa());
            ps.setString(3, f.getIeEmpresa());
            ps.setString(4, f.getEmailEmpresa());

            ps2.executeUpdate();
            ps3.executeUpdate();
            ps.executeUpdate();

            ps2.close();
            ps3.close();
            ps.close();
        } catch (Exception e) {
            throw new Exception("Erro ao inserir os dados!" + 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(Fornecedor f) throws Exception {
    PreparedStatement ps = null;

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

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            String sql = "update tbl_fornecedor set nome_empresa=? cnpj=? ie=? email=? ";
            ps = con.prepareStatement(sql);

            ps.setString(1, f.getNomeEmpresa());
            ps.setString(2, f.getCnpjEmpresa());
            ps.setString(3, f.getIeEmpresa());
            ps.setString(4, f.getEmailEmpresa());

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

        } 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(Fornecedor f) throws Exception {
    PreparedStatement ps = null;

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

        try {
            //con = ConnectionFactory.getInstance().getConnection();
            String sql = "update tbl_fornecedor set flag_ativo=?";
            ps = con.prepareStatement(sql);
            ps.setInt(1, f.getFlagEmpresa());

            ps.executeUpdate();
            ps.close();
        } 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<Fornecedor> LerFornecedorCombo() throws Exception {

    PreparedStatement ps = null;
    ResultSet rs = null;

    ArrayList<Fornecedor> lista = new ArrayList<>();
    try {

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            ps = con.prepareStatement("select * from tbl_fornecedor");
            rs = ps.executeQuery();
            while (rs.next()) {

                Fornecedor f = new Fornecedor();
                f.setIdFornecedor(rs.getInt("id_fornecedor"));
                f.setNomeEmpresa(rs.getString("nome_empresa"));
                lista.add(f);

            }
            ps.close();
            rs.close();

        } catch (Exception e) {

            JOptionPane.showMessageDialog(null, "Erro ao pegar dados dos Fornecedores! " + 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 lista;

}

public ArrayList<Fornecedor> ConsultaF() throws Exception {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Fornecedor> listaF = new ArrayList<>();
    try {

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            String sql = "select forn.nome_empresa, forn.cnpj,forn.ie,"
                    + " forn.email, tel.telefone_fixo_fornecedor, tel.celular1_fornecedor, "
                    + "tel.celular2_fornecedor, ende.cidade_fornecedor from tbl_fornecedor forn"
                    + " inner join tbl_telefone_fornecedor tel on "
                    + " forn.fk_telefone_fornecedor = tel.id_telefone_fornecedor inner join tbl_endereco_fornecedor ende "
                    + "on forn.fk_endereco_fornecedor = ende.id_endereco_fornecedor where forn.flag_ativo=1 ORDER BY forn.nome_empresa";

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

            while (rs.next()) {
                Fornecedor f = new Fornecedor();
                TelefoneFornecedor tf = new TelefoneFornecedor();
                EnderecoFornecedor ef = new EnderecoFornecedor();

                f.setNomeEmpresa(rs.getString("nome_empresa"));
                f.setCnpjEmpresa(rs.getString("cnpj"));
                f.setIeEmpresa(rs.getString("ie"));
                f.setEmailEmpresa(rs.getString("email"));

                tf.setTelefoneFixo(rs.getString("telefone_fixo_fornecedor"));
                tf.setCelular1(rs.getString("celular1_fornecedor"));
                tf.setCelular2(rs.getString("celular2_fornecedor"));

                ef.setCidade(rs.getString("cidade_fornecedor"));

                f.setEndereçoEmpresa(ef);
                f.setTelefoneEmpresa(tf);

                listaF.add(f);
            }
            ps.close();
            rs.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar os dados dos Fornecedores!" + 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 listaF;

}

public ArrayList<Fornecedor> ConsultaFNome(String nome) throws Exception {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Fornecedor> listaF = new ArrayList<>();
    try {

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            String sql = "select forn.nome_empresa, forn.cnpj,forn.ie,"
                    + " forn.email, tel.telefone_fixo_fornecedor, tel.celular1_fornecedor, "
                    + "tel.celular2_fornecedor, e.cidade_fornecedor from tbl_fornecedor forn"
                    + " inner join tbl_telefone_fornecedor tel on "
                    + " forn.fk_telefone_fornecedor = tel.id_telefone_fornecedor inner join "
                    + "tbl_endereco_fornecedor e on forn.fk_endereco_fornecedor = e.id_endereco_fornecedor"
                    + " where forn.flag_ativo=1 and forn.nome_empresa like '%"
                    + nome + "%'  ORDER BY forn.nome_empresa";

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

            while (rs.next()) {
                Fornecedor f = new Fornecedor();
                TelefoneFornecedor tf = new TelefoneFornecedor();
                EnderecoFornecedor ef = new EnderecoFornecedor();

                f.setNomeEmpresa(rs.getString("nome_empresa"));
                f.setCnpjEmpresa(rs.getString("cnpj"));
                f.setIeEmpresa(rs.getString("ie"));
                f.setEmailEmpresa(rs.getString("email"));

                tf.setTelefoneFixo(rs.getString("telefone_fixo_fornecedor"));
                tf.setCelular1(rs.getString("celular1_fornecedor"));
                tf.setCelular2(rs.getString("celular2_fornecedor"));

                ef.setCidade(rs.getString("cidade_fornecedor"));

                f.setEndereçoEmpresa(ef);
                f.setTelefoneEmpresa(tf);

                listaF.add(f);
            }
            ps.close();
            rs.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar os dados dos Fornecedores!" + 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);
        }
        System.out.println("Conexão ConsultaFornecedornome Fechada");
    }
    return listaF

}

public ArrayList<Fornecedor> ConsultaFCod(int cod) throws Exception {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Fornecedor> listaF = new ArrayList<>();
    try {

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            String sql = "select forn.nome_empresa, forn.cnpj,forn.ie,"
                    + " forn.email, tel.telefone_fixo_fornecedor, tel.celular1_fornecedor, "
                    + "tel.celular2_fornecedor, e.cidade_fornecedor from tbl_fornecedor forn"
                    + " inner join tbl_telefone_fornecedor tel on "
                    + " forn.fk_telefone_fornecedor = tel.id_telefone_fornecedor inner join "
                    + "tbl_endereco_fornecedor e on forn.fk_endereco_fornecedor = e.id_endereco_fornecedor"
                    + " where forn.flag_ativo=1 and forn.id_fornecedor ="
                    + cod + "  ORDER BY forn.id_fornecedor";

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

            while (rs.next()) {
                Fornecedor f = new Fornecedor();
                TelefoneFornecedor tf = new TelefoneFornecedor();
                EnderecoFornecedor ef = new EnderecoFornecedor();

                f.setNomeEmpresa(rs.getString("nome_empresa"));
                f.setCnpjEmpresa(rs.getString("cnpj"));
                f.setIeEmpresa(rs.getString("ie"));
                f.setEmailEmpresa(rs.getString("email"));

                tf.setTelefoneFixo(rs.getString("telefone_fixo_fornecedor"));
                tf.setCelular1(rs.getString("celular1_fornecedor"));
                tf.setCelular2(rs.getString("celular2_fornecedor"));

                ef.setCidade(rs.getString("cidade_fornecedor"));

                f.setEndereçoEmpresa(ef);
                f.setTelefoneEmpresa(tf);

                listaF.add(f);
            }
            ps.close();
            rs.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar os dados dos Fornecedores!" + 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);
        }
        System.out.println("Conexão ConsultaForncedorid Fechada");
    }
    return listaF;

}

public ArrayList<Fornecedor> ConsultaFCNPJ(String cnpj) throws Exception {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Fornecedor> listaF = new ArrayList<>();
    try {

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            String sql = "select forn.nome_empresa, forn.cnpj,forn.ie,"
                    + " forn.email, tel.telefone_fixo_fornecedor, tel.celular1_fornecedor, "
                    + "tel.celular2_fornecedor, e.cidade_fornecedor from tbl_fornecedor forn"
                    + " inner join tbl_telefone_fornecedor tel on "
                    + " forn.fk_telefone_fornecedor = tel.id_telefone_fornecedor inner join "
                    + "tbl_endereco_fornecedor e on forn.fk_endereco_fornecedor = e.id_endereco_fornecedor"
                    + " where forn.flag_ativo=1 and forn.cnpj like '%"
                    + cnpj + "%'  ORDER BY forn.cnpj";

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

            while (rs.next()) {
                Fornecedor f = new Fornecedor();
                TelefoneFornecedor tf = new TelefoneFornecedor();
                EnderecoFornecedor ef = new EnderecoFornecedor();

                f.setNomeEmpresa(rs.getString("nome_empresa"));
                f.setCnpjEmpresa(rs.getString("cnpj"));
                f.setIeEmpresa(rs.getString("ie"));
                f.setEmailEmpresa(rs.getString("email"));

                tf.setTelefoneFixo(rs.getString("telefone_fixo_fornecedor"));
                tf.setCelular1(rs.getString("celular1_fornecedor"));
                tf.setCelular2(rs.getString("celular2_fornecedor"));

                ef.setCidade(rs.getString("cidade_fornecedor"));

                f.setEndereçoEmpresa(ef);
                f.setTelefoneEmpresa(tf);

                listaF.add(f);
            }
            ps.close();
            rs.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar os dados dos Fornecedores!" + 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);
        }
        System.out.println("Conexão ConsultaFornecedorcnpj Fechada");
    }
    return lista

}

public ArrayList<Fornecedor> ConsultaFCidade(String cidade) throws Exception {
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Fornecedor> listaF = new ArrayList<>();
    try {

        try {
            //con = ConnectionFactory.getInstance().getConnection();

            String sql = "select forn.nome_empresa, forn.cnpj,forn.ie,"
                    + " forn.email, tel.telefone_fixo_fornecedor, tel.celular1_fornecedor, "
                    + "tel.celular2_fornecedor, e.cidade_fornecedor from tbl_fornecedor forn"
                    + " inner join tbl_telefone_fornecedor tel on "
                    + " forn.fk_telefone_fornecedor = tel.id_telefone_fornecedor inner join "
                    + "tbl_endereco_fornecedor e on forn.fk_endereco_fornecedor = e.id_endereco_fornecedor"
                    + " where forn.flag_ativo=1 and e.cidade_fornecedor like '%"
                    + cidade + "%'  ORDER BY e.cidade_fornecedor";

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

            while (rs.next()) {
                Fornecedor f = new Fornecedor();
                TelefoneFornecedor tf = new TelefoneFornecedor();
                EnderecoFornecedor ef = new EnderecoFornecedor();

                f.setNomeEmpresa(rs.getString("nome_empresa"));
                f.setCnpjEmpresa(rs.getString("cnpj"));
                f.setIeEmpresa(rs.getString("ie"));
                f.setEmailEmpresa(rs.getString("email"));

                tf.setTelefoneFixo(rs.getString("telefone_fixo_fornecedor"));
                tf.setCelular1(rs.getString("celular1_fornecedor"));
                tf.setCelular2(rs.getString("celular2_fornecedor"));

                ef.setCidade(rs.getString("cidade_fornecedor"));

                f.setEndereçoEmpresa(ef);
                f.setTelefoneEmpresa(tf);

                listaF.add(f);
            }
            ps.close();
            rs.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar os dados dos Fornecedores!" + 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);
        }
        System.out.println("Conexão ConsultaFornecedorcidade Fechada");
    }
    return listaF;}

}

Todos os meus DAOs estão nessa mesma estrutura. Há alguma coisa errada na minha classe de conexão ou no DAO? O que devo fazer? Desde já agradeço!