SpringBoot 2 - Монитор подключения к БД

Я настроил соединение с БД (HikariCP) на SprintBoot 2. У меня poolName определена в application.properties:

spring.datasource.hikari.poolName=HikariConnectionPool

Я хочу отслеживать количество простаивающих соединений с БД, поэтому я попытался создать поток, который отслеживает соединения с БД как:

public class HikariCPStatistics implements Runnable {

    public static final Logger logger = LoggerFactory.getLogger(HikariCPStatistics.class);

    private static HikariPoolMXBean poolProxy;

    public HikariCPStatistics() {
            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
            try {
                    ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (HikariConnectionPool)");
                    poolProxy = JMX.newMXBeanProxy(mBeanServer, poolName, HikariPoolMXBean.class);

            } catch (MalformedObjectNameException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            }
    }

    @Override
    public void run() {
            logger.info("Starting Connection Pool status monitor");
            while ( true ) {
                    logger.info("Hikari - Idle Connections: " + poolProxy.getIdleConnections());
                    try {
                            Thread.sleep(5000);
                    } catch (InterruptedException e) {
                            logger.error("Fail to run Connection Pool status monitor");
                            e.printStackTrace();
                    }
            }

    }

}

но я получаю исключение, что он не может найти экземпляр poolName HikariConnectionPool. Любое предложение о том, как я могу получить простаивающие соединения с БД, управляемые HikariCP?


Дальнейший анализ показал, что SpringBoot на самом деле не регистрирует bean-компонент Бассейн в JMX. SpringBoot публикует только bean-компонент HikariDataSource в JMX, который имеет статическую конфигурацию источника данных Hikari. Насколько я могу судить, Hikari поддерживает 2 разных шаблона конфигурации:
. 1) конфигурация через класс HikariConfig
2) прямая настройка HikariDataSource
SpringBoot использует второй вариант. Я пробовал в прошлом 1-й вариант настройки HikariCP (без SpringBoot), который регистрировал Бассейн и PoolConfig Beans .... Bean Бассейн - это тот, который меня интересует, который использует соединения.

Кто-нибудь знает, как я могу настроить как вариант (1 - класс HikariConfig), установленный HikariDataSource в SpringBoot? Или как-нибудь springboot для создания Бассейн Bean?

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
8 347
3

Ответы 3

Вы можете получить много информации из пула соединений Hikari, внедрив HikariDataSource. даже в виде списка.

private final List<HikariDataSource> hikariConfigMXBeans;

infos like name = hikariDataSource.getPoolName();
idleTimeout = hikariDataSource.getIdleTimeout();
validationTimeout = hikariDataSource.getValidationTimeout();
connectionTimeout = hikariDataSource.getConnectionTimeout();
leakDetectionThreshold = hikariDataSource.getLeakDetectionThreshold();
maxLifetime = hikariDataSource.getMaxLifetime();
minimumIdle = hikariDataSource.getMinimumIdle();
maxPoolSize = hikariDataSource.getMaximumPoolSize();

Отсюда легко создать конечную точку привода для отображения этой информации.

Надеюсь, это та информация, которую вам нужно отслеживать

Привет, Рик. Спасибо за Ваш ответ. Пример, который вы напишете, может получить статическую конфигурацию пула Hikari. Я ищу динамическую информацию ... в этом случае poolProxy.getIdleConnections, которые дают текущее количество доступных подключений в пуле в состоянии ожидания ... поэтому я могу контролировать во время выполнения приложение, если оно потребляет все подключение из пула.

Helio Aymoto 09.06.2018 14:59

аааа хорошо, извините. неправильно понятый :)

rick 09.06.2018 15:00

Чтобы получить «незанятые соединения с БД, управляемые HikariCP, сначала получите HikariPool, используемый Весенний ботинок.

HikariPool hikariPool = (HikariPool) new DirectFieldAccessor(getDataSource()).getPropertyValue("pool");

А затем используйте метод HikariPool, чтобы получить текущий статус незанятых соединений:

hikariPool.getIdleConnections();

Для инициализации с помощью HikariConfig см. Инициализация Хикари

HikariConfig config = new HikariConfig();

config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");

config.setUsername("bart");

..

HikariDataSource ds = new HikariDataSource(config);

Вот как я отслеживаю пул соединений

        HikariPool hikariPool = (HikariPool)
                new DirectFieldAccessor(dataSource).getPropertyValue("pool");

        //Getting pool connection info
        logger.info(" hikariPool getActiveConnections : " + hikariPool.getActiveConnections());
        logger.info(" hikariPool getTotalConnections : " + hikariPool.getTotalConnections());
        logger.info(" hikariPool getIdleConnections : " + hikariPool.getIdleConnections());
        logger.info(" hikariPool getThreadsAwaitingConnection : " + hikariPool.getThreadsAwaitingConnection());

        //Getting maximum pool size - set from properties
        Integer t= new HikariDataSourcePoolMetadata((HikariDataSource) dataSource).getMax();
        logger.info(" hikariPool Maximum Pool Size : " + t.toString());

привет как определить пул? какова стоимость пула? что он делает .getPropertyValue ("пул");

jcrshankar 23.10.2019 13:00

Другие вопросы по теме