如何在Hibernate 5 Core中结合HikariCP与FlexyPool获取连接池指标?
集成FlexyPool到Hibernate 5 + HikariCP获取连接池指标
1. 添加依赖
在项目中引入FlexyPool核心包及HikariCP适配包(以Maven为例):
<dependency> <groupId>com.vladmihalcea.flexy-pool</groupId> <artifactId>flexy-hikaricp</artifactId> <version>2.2.0</version> <!-- 使用最新稳定版本 --> </dependency> <dependency> <groupId>com.vladmihalcea.flexy-pool</groupId> <artifactId>flexy-core</artifactId> <version>2.2.0</version> </dependency>
2. 修改hibernate.cfg.xml配置
替换原有HikariCP的直接配置,改为通过FlexyPool包装HikariCP数据源:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 指定FlexyPool的HikariCP适配器作为数据源 --> <property name="hibernate.connection.datasource">com.vladmihalcea.flexypool.adaptor.HikariCPPoolAdapter</property> <!-- FlexyPool基础配置 --> <property name="flexy.pool.unique.name">hibernate-flexy-pool</property> <property name="flexy.pool.metrics.reporter.jmx.enabled">true</property> <!-- 开启JMX指标暴露 --> <!-- 底层HikariCP配置,前缀改为flexy.pool.hikari --> <property name="flexy.pool.hikari.dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</property> <property name="flexy.pool.hikari.dataSource.serverName">192.168.1.1</property> <property name="flexy.pool.hikari.dataSource.portNumber">5432</property> <property name="flexy.pool.hikari.dataSource.databaseName">dbtest</property> <property name="flexy.pool.hikari.dataSource.user">dbuser</property> <property name="flexy.pool.hikari.dataSource.password">dbpass</property> <property name="flexy.pool.hikari.dataSource.reWriteBatchedInserts">true</property> <property name="flexy.pool.hikari.maximumPoolSize">10</property> <property name="flexy.pool.hikari.minimumIdle">2</property> <property name="flexy.pool.hikari.idleTimeout">300000</property> <property name="flexy.pool.hikari.connectionTimeout">20000</property> <property name="flexy.pool.hikari.maxLifetime">600000</property> <property name="flexy.pool.hikari.leakDetectionThreshold">30000</property> <!-- 原有Hibernate其他配置保持不变 --> <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL10Dialect</property> <property name="hibernate.connection.release_mode">auto</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.flushMode">AUTO</property> <property name="hibernate.jdbc.batch_size">20</property> <property name="hibernate.order_inserts">true</property> <property name="hibernate.order_updates">true</property> <property name="hibernate.batch_versioned_data">true</property> <property name="hibernate.show_sql">false</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">validate</property> <property name="hibernate.generate_statistics">true</property> <property name="hibernate.session.events.log.LOG_QUERIES_SLOWER_THAN_MS">1000</property> </session-factory> </hibernate-configuration>
关键改动说明:
- 用
hibernate.connection.datasource指定FlexyPool的Hikari适配器类 - 所有原有HikariCP配置的前缀从
hibernate.hikari/hikari改为flexy.pool.hikari - 开启JMX指标暴露,方便通过JConsole/VisualVM查看监控数据
3. 获取和使用FlexyPool指标
方式1:通过JMX查看
启动应用后,打开JConsole或VisualVM连接到应用进程,在MBean节点com.vladmihalcea.flexypool下可查看核心指标:
- 活跃/空闲连接数
- 等待连接的请求数
- 连接获取平均等待时间
- 连接泄漏统计
方式2:代码中直接获取指标
如果需要自定义处理指标,可通过以下代码提取:
import com.vladmihalcea.flexypool.FlexyPoolDataSource; import com.vladmihalcea.flexypool.metrics.Metrics; import org.hibernate.SessionFactory; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; // 获取已初始化的SessionFactory实例 SessionFactory sessionFactory = ...; ConnectionProvider connectionProvider = sessionFactory.getSessionFactoryOptions() .getServiceRegistry().getService(ConnectionProvider.class); if (connectionProvider instanceof org.hibernate.engine.jdbc.connections.spi.DatasourceConnectionProviderImpl) { org.hibernate.engine.jdbc.connections.spi.DatasourceConnectionProviderImpl dsProvider = (org.hibernate.engine.jdbc.connections.spi.DatasourceConnectionProviderImpl) connectionProvider; FlexyPoolDataSource flexyPoolDataSource = (FlexyPoolDataSource) dsProvider.getDataSource(); // 获取指标实例 Metrics metrics = flexyPoolDataSource.getMetrics(); // 提取具体指标 int activeConnections = metrics.getActiveConnections(); int idleConnections = metrics.getIdleConnections(); long avgWaitTime = metrics.getAverageConnectionWaitTime(); // 自定义处理,比如打印或上报监控系统 System.out.println("活跃连接数:" + activeConnections); System.out.println("空闲连接数:" + idleConnections); System.out.println("平均连接等待时间(ms):" + avgWaitTime); }
4. 可选:日志输出指标
若需定期将指标输出到日志,添加以下配置:
<property name="flexy.pool.metrics.reporter.slf4j.enabled">true</property> <property name="flexy.pool.metrics.reporter.slf4j.loggingInterval">60</property> <!-- 每60秒输出一次 --> <property name="flexy.pool.metrics.reporter.slf4j.loggerName">flexy-pool-metrics</property>
然后在日志配置中开启flexy-pool-metrics的INFO级别日志,即可定期看到连接池指标输出。
内容的提问来源于stack exchange,提问作者MrWalterWhite
相关产品推荐
相关产品推荐

