4

当我使用 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();
    }
}

我该如何解决?

4

2 回答 2

10

正如JDBC 文档所解释的,使用PGPoolingDataSource不是一个好主意。

基本问题是getConnection()的调用将被阻止,直到达到连接限制时关闭连接。

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

可能的解决方案:

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

编辑:您可以通过简单地运行来检查打开的连接数量:

SELECT * FROM pg_stat_activity

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

于 2012-11-03T00:35:57.867 回答
0

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

处理这种情况的最佳方法因情况而异。如果客户端是你自己的代码,那和客户端是未知组织中不知名的人编写的代码有很大不同。

于 2012-11-03T00:44:11.223 回答