Hikaricp 获取HikariDataSource上的活动连接

Hikaricp 获取HikariDataSource上的活动连接,hikaricp,Hikaricp,我正在试图弄清楚目前有多少连接被打开,但我似乎找不到一个明显的方法来使用Hikari实现这一点 HikariPool公开了这些信息(getActiveConnections),但我看不到从HikariDataSource访问这些信息的简单方法,您必须通过JMX编程访问。首先,通过registerMbeans属性或调用setRegisterMans()来启用MBean注册。然后查阅本页了解如何执行编程访问: 如果您使用的是spring boot: new HikariDataSourcePoolM

我正在试图弄清楚目前有多少连接被打开,但我似乎找不到一个明显的方法来使用Hikari实现这一点


HikariPool
公开了这些信息(
getActiveConnections
),但我看不到从
HikariDataSource

访问这些信息的简单方法,您必须通过JMX编程访问。首先,通过
registerMbeans
属性或调用
setRegisterMans()
来启用MBean注册。然后查阅本页了解如何执行编程访问:


如果您使用的是spring boot:

new HikariDataSourcePoolMetadata(dataSource).getActive();

为了更好地监控,您可以使用以下类:

            import javax.sql.DataSource;
            import org.aspectj.lang.JoinPoint;
            import org.aspectj.lang.annotation.After;
            import org.aspectj.lang.annotation.Aspect;
            import org.aspectj.lang.annotation.Before;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.stereotype.Component;
            import com.zaxxer.hikari.HikariDataSource;
            import com.zaxxer.hikari.pool.HikariPool;
            import lombok.extern.slf4j.Slf4j;


            @Aspect
            @Component
            @Slf4j
            public class DataSourceAspectLogger {

                private HikariPool pool;

                @Autowired
                private HikariDataSource ds;

                @Before("execution(* com.x.common.sql.repo.*.*(..))")
                public void logBeforeConnection(JoinPoint jp) throws Throwable {
                    logDataSourceInfos("Before", jp);
                }

                @After("execution(* com.x.common.sql.repo.*.*(..)) ")
                public void logAfterConnection(JoinPoint jp) throws Throwable {
                    logDataSourceInfos("After", jp);
                }

                @Autowired
                public void getPool() {
                    try {
                        java.lang.reflect.Field field = ds.getClass().getDeclaredField("pool");
                        field.setAccessible(true);
                        this.pool = (HikariPool) field.get(ds);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }

                public void logDataSourceInfos(final String time, final JoinPoint jp) {
                    final String method = String.format("%s:%s", jp.getTarget().getClass().getName(), jp.getSignature().getName());
                    int totalConnections = pool.getTotalConnections();
                    int activeConnections = pool.getActiveConnections();
                    int freeConnections = totalConnections - activeConnections;
                    int connectionWaiting = pool.getThreadsAwaitingConnection();
                    log.info(String.format("%s %s: number of connections in use by the application (active): %d.", time, method, activeConnections));
                    log.info(String.format("%s %s: the number of established but idle connections: %d.", time, method, freeConnections));
                    log.info(String.format("%s %s: number of threads waiting for a connection: %d.", time, method, connectionWaiting));
                    log.info(String.format("%s %s: max pool size: %d.", time, method, ds.getMaximumPoolSize()));
                }
            }

谢谢你的回答,布雷特。我自己创建和管理
HikariDataSource
。如果这很“容易”,那么您就不能使用API访问这些信息吗?我不能也不会为此使用JMX。谢谢。我会考虑下一个版本。当你有一个成千上万的用户在使用的项目时,添加API的好处是你最好对你所选择的100%满意,因为一旦它在野外,改变它是非常困难的。在您的场景中,需要活动连接的用例是什么?请检查“啊,啊”的问题。在我的例子中,我必须添加casting-new-HikariDataSourcePoolMetadata((HikariDataSource)dataSource)