получить активное соединение с HikariDataSource

Я пытаюсь выяснить, сколько соединений в настоящее время открыто, и я не могу найти очевидный способ сделать это с Hikari.

HikariPool раскрывает эту информацию (getActiveConnections), но я не вижу простого способа получить к ней доступ из HikariDataSource.


person Stephane Nicoll    schedule 12.06.2014    source источник


Ответы (3)


Вам нужно будет получить его через программный доступ JMX. Сначала включите регистрацию MBean через свойство registerMbeans или вызовом setRegisterMeans(). Затем обратитесь к этой странице, чтобы узнать, как выполнить программный доступ:

https://github.com/brettwooldridge/HikariCP/wiki/JMX-Monitoring

person brettw    schedule 12.06.2014
comment
спасибо за ответ Бретт. Я сам создаю и управляю HikariDataSource. Если это так просто, не могли бы вы просто предоставить доступ к этой информации с помощью API? Я не могу и не буду использовать для этого JMX. Спасибо. - person Stephane Nicoll; 13.06.2014
comment
Я рассмотрю это для предстоящего выпуска. Суть добавления API, когда у вас есть проект, который используют тысячи пользователей, заключается в том, что вам лучше быть на 100% удовлетворенным тем, что вы выбрали, потому что изменить его очень сложно, когда он уже запущен. Каков вариант использования активных подключений в вашем сценарии? - person brettw; 14.06.2014
comment
Проверьте проблему #1013 в Проект Spring Boot - person Stephane Nicoll; 14.06.2014

Если вы используете весеннюю загрузку:

new HikariDataSourcePoolMetadata(dataSource).getActive();
person Devs love ZenUML    schedule 20.08.2016
comment
Ах ах. Знаю, спасибо! - person Stephane Nicoll; 20.08.2016
comment
В моем случае мне пришлось добавить кастинг - new HikariDataSourcePoolMetadata((HikariDataSource) dataSource).getMax() - person Fholisani Mashegana; 29.08.2019

Вы можете использовать класс ниже для лучшего мониторинга:

            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()));
                }
            }
person Ashish Sharma    schedule 06.09.2019