当我使用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();
}
}
我该如何解决这个问题?
答案 0 :(得分:6)
使用 PGPoolingDataSource 作为JDBC documentation explains并不是一个好主意。
基本问题是,当连接限制达到连接时,将阻止对 getConnection()的调用。
您已将值30设置为最大并发连接数,因此如果打算打开31,则会导致线程上的阻塞进行调用。
可能的解决方案:
编辑:您只需运行以下命令即可检查已打开的连接数量:
SELECT * FROM pg_stat_activity
每一行都是一个连接(包括来自pgAdmin和查询分析器的连接)。如果你确定连接数量不应该达到上限(但它确实如此),那么你可能遇到某种连接泄漏问题。
答案 1 :(得分:0)
如果我的经验相关,问题可能不在这里,而是由于某种原因,您的客户并不总是关闭他们的连接 - 通常是在错误处理方案中忘记这样做。
处理此问题的最佳方式因方案而异。如果客户端是您自己的代码,则与客户端是由未知组织中的未知人员编写的代码时有很大不同。