【问题标题】:database pool with PGPoolingDataSource?PGoolingDataSource 的数据库池?
【发布时间】:2012-10-23 12:25:54
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: java postgresql jdbc connection-pooling


    【解决方案1】:

    使用PGPoolingDataSource 不是一个好主意,如JDBC documentation explains

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

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

    可能的解决方案:

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

    编辑:您只需运行即可检查打开的连接数量:

    SELECT * FROM pg_stat_activity
    

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

    【讨论】:

    • 同意;最好使用适当的池系统,如 DBCP、C3P0 或您的应用服务器/容器的内置连接池。
    • 我在 tomcat 中重新加载 web 应用程序时遇到连接泄漏问题,该问题已解决。我也会尝试 BDCP
    • 您提到如果 getConnection() 阻塞是一个问题。应该注意的是,在某些情况下,这可能正是您想要的行为。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2011-05-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2012-08-13
      相关资源
      最近更新 更多