数据库池与PGPoolingDataSource?

时间:2012-11-02 19:51:29

标签: java postgresql jdbc connection-pooling

当我使用PGPoolingDataSource类创建数据库池时遇到问题,一段时间后,当许多用户正在工作并且没有显示错误时,池会关闭

创建池的类的代码是:

public class PgConexion {
    private static PgConexion _instancia = new PgConexion(); // instancia de la clase
    private Configuracion config;
    private PGPoolingDataSource source;

    /**
     * instancia la clase y carga las opciones de configuracion
     */
    public PgConexion() {
        final URL archivo = Constantes.RUTA_CONFIG;

        if(archivo != null){
            config = new Configuracion(archivo);
        }
    }

    /**
     * regresa la instancia del pool de conexiones
     * @return
     */
    public static PgConexion getInstance() {
        return _instancia;
    }

    /**
     * crear la conexion la conexion
     * @return
     * @throws SQLException
     */
    public void crearConexion() throws SQLException{
        source = new PGPoolingDataSource(); 

        // configuracion del pool
        source.setDataSourceName("Logistica");
        source.setServerName(config.get("servidor_sql"));
        source.setPortNumber(Integer.parseInt(config.get("puerto_sql")));
        source.setDatabaseName(config.get("bd_sql"));
        source.setUser(config.get("usuario_sql"));
        source.setPassword(config.get("contrasena_sql"));
        source.setMaxConnections(30);
    }

    /**
     * devuelve la conecion a utilizar
     * @return
     * @throws SQLException
     */
    public Connection nuevaConexion() throws SQLException{
        if(source == null){
            crearConexion();
        }

        // genero la conexion de la lista del pool
        return source.getConnection();
    }

    /**
     * Cierra las conexiones y libera los recursos
     */
    public void cerrarConexion(){
        source.close();
    }
}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

使用 PGPoolingDataSource 作为JDBC documentation explains并不是一个好主意。

基本问题是,当连接限制达到连接时,将阻止对 getConnection()的调用。

您已将值30设置为最大并发连接数,因此如果打算打开31,则会导致线程上的阻塞进行调用。

可能的解决方案:

  • 如果您确定并发连接的实际上限数,请增加 maxConnections 。您还应该检查 postgresql.conf 中的服务器端连接限制。
  • 使用PGSimpleDataSource。根据应用程序的类型,不使用连接池(因此每次创建连接)都不会有问题。
  • 如果您确实需要一个连接池,只需在Java级别实现自己的连接。

编辑:您只需运行以下命令即可检查已打开的连接数量:

SELECT * FROM pg_stat_activity

每一行都是一个连接(包括来自pgAdmin和查询分析器的连接)。如果你确定连接数量不应该达到上限(但它确实如此),那么你可能遇到某种连接泄漏问题。

答案 1 :(得分:0)

如果我的经验相关,问题可能不在这里,而是由于某种原因,您的客户并不总是关闭他们的连接 - 通常是在错误处理方案中忘记这样做。

处理此问题的最佳方式因方案而异。如果客户端是您自己的代码,则与客户端是由未知组织中的未知人员编写的代码时有很大不同。