You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GlassFish5上的JSP应用中HikariCP生成大量PostgreSQL空闲连接原因咨询

Hey there! 看起来你正在为GlassFish 5上的JSP应用配置HikariCP来连接PostgreSQL,我帮你把这段配置补全并梳理清楚,确保它能稳定运行:

HikariCP 配置 PostgreSQL 完整指南(GlassFish 5 + JSP)

1. 前置依赖准备

首先得确保GlassFish能找到HikariCP和PostgreSQL驱动的jar包:

  • 下载对应版本的 postgresql-<version>.jar(推荐用最新稳定版,比如42.6.0),放到GlassFish安装目录下的 domains/domain1/lib 文件夹
  • 下载 HikariCP-<version>.jar(比如5.0.1),同样放到上述目录,然后重启GlassFish生效

2. 完整的HikariCP配置代码

你给出的配置已经有了核心参数,我帮你补全并添加了推荐的优化项:

// 初始化HikariCP配置对象
HikariConfig config = new HikariConfig();

// 指定PostgreSQL的数据源实现类
config.setDataSourceClassName("org.postgresql.ds.PGSimpleDataSource");

// 数据库连接核心参数(替换成你的实际配置)
config.addDataSourceProperty("serverName", host); // 数据库主机地址,比如"localhost"
config.addDataSourceProperty("portNumber", port); // 端口,默认5432,注意是Integer类型
config.addDataSourceProperty("databaseName", database); // 数据库名称
config.addDataSourceProperty("user", username); // 数据库用户名
config.addDataSourceProperty("password", password); // 数据库密码

// 推荐添加的PostgreSQL性能优化参数
config.addDataSourceProperty("cachePrepStmts", "true"); // 开启预编译语句缓存
config.addDataSourceProperty("prepStmtCacheSize", "250"); // 缓存大小
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); // 单条SQL最大长度
config.addDataSourceProperty("useServerPrepStmts", "true"); // 使用服务器端预编译

// 连接池核心配置(根据你的应用并发量调整)
config.setMaximumPoolSize(10); // 最大连接数
config.setMinimumIdle(2); // 最小空闲连接数
config.setConnectionTimeout(30000); // 获取连接超时时间(30秒)
config.setIdleTimeout(600000); // 空闲连接回收时间(10分钟)
config.setMaxLifetime(1800000); // 连接最大存活时间(30分钟)

// 创建最终的数据源对象
HikariDataSource dataSource = new HikariDataSource(config);

3. 在JSP中使用连接池的正确姿势

不要在JSP里直接初始化连接池(会导致重复创建),建议在ServletContextListener中全局初始化,然后存到应用上下文里复用:

<%@ page import="com.zaxxer.hikari.HikariDataSource" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>

<%
// 从应用上下文获取全局的数据源
HikariDataSource dataSource = (HikariDataSource) application.getAttribute("hikariDataSource");
try (Connection conn = dataSource.getConnection();
     PreparedStatement stmt = conn.prepareStatement("SELECT * FROM your_table");
     ResultSet rs = stmt.executeQuery()) {
    // 处理查询结果
    while (rs.next()) {
        out.println("数据:" + rs.getString("your_column"));
    }
} catch (Exception e) {
    e.printStackTrace();
}
%>

4. 关键注意事项

  • 确保port参数是Integer类型(比如5432),不要传字符串,否则会抛出参数类型错误
  • 避免在JSP或请求线程中重复创建HikariDataSource,全局只需要一个实例
  • 如果GlassFish已经配置了内置的JDBC连接池,要避免和HikariCP的数据源重名,防止冲突
  • 记得捕获配置和使用过程中的异常,比如SQLException,方便排查问题

内容的提问来源于stack exchange,提问作者MbaiMburu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:17:25