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
相关产品推荐
相关产品推荐

