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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:43