当前位置: 首页 > 知识库问答 >
问题:

SpringBoot 2-监视器数据库连接

施玉宸
2023-03-14

我在SprintBoot 2上配置了一个DB连接(HikariCP)。我在application.properties中定义了poolName:

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管理的空闲DB连接,有什么建议吗?

进一步html" target="_blank">分析,我可以看到SpringBoot实际上并没有在JMX中注册池bean。SpringBoot只在JMX中发布HikariDataSource bean,它具有Hikari dataSource的静态配置。从我所看到的,Hikari支持2种不同的配置模式:
1)通过HikariConfig类进行配置
2)HikariDataSource的直接配置
SpringBoot正在使用第二个选项。
我在过去尝试过配置HikariCP的第一个选项(没有SpringBoot)这是注册池和池配置豆......池bean是我感兴趣的一个,它有连接的用法。

有人知道我如何配置SpringBoot中安装的HikariDataSource选项(1-HikariConfig类)吗?或者用springboot创建一个池Bean?

谢谢。

共有3个答案

步嘉德
2023-03-14

这就是我监视连接池的方式

        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());
施兴言
2023-03-14

通过注入HikariDataSource,您可以从Hikari连接池获得大量信息。甚至作为一个列表。

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();

从这里很容易创建一个执行器endpoint来显示此信息。

希望这是你需要监控的信息

虞华彩
2023-03-14

要获得HIKARIPC管理的“空闲DB连接”,首先获取Spring Boot使用的HikariPool

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

然后使用HikariPool方法获取当前空闲连接状态:

hikariPool.getIdleConnections();

要通过HikariConfig初始化,请参阅Hikari的初始化

新配置:

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

config.set用户名("bart");

..

HikariDataSource ds=new HikariDataSource(配置);

 类似资料:
  • 数据库解决方案:每当工具A运行时,它会添加一个数据库记录,其中包括时间戳、元数据和状态“运行”。如果执行了工具A,而工具B应该运行,它会将DB记录状态更新为“NEXT_TOOL_B”。工具B经常查询DB中具有“NEXT_TOOL_B”状态的记录。如果它发现了一些东西,工具B将使用来自DB记录的元数据运行。 虽然我意识到数据库解决方案的缺点,例如从工具B进行持续轮询,但我错过了基于消息的解决方案中的

  • 问题内容: 我正在使用node.js服务器在Web应用程序和数据库之间创建一个“接近实时”套接字。当前,我使用的是MySQL,它每秒在节点中轮询一次,以检查表是否有任何更改(基于时间戳)。 我想知道是否有使用MySQL进行此类操作的特定技术?目前,我只是在运行SQL查询并在下一次轮询之前使用setTimeout。 我知道在这样的实例中使用NoSQL数据库更为普遍,但我对技术并不满意,我宁愿使用SQ

  • 连接数据库 在能够对MongDB进行操作之前,需要使用BuguFramework创建一个数据库连接,代码如下: BuguConnection conn = BuguFramework.getInstance().createConnection(); conn.connect("192.168.0.100", 27017, "mydb", "username", "password"); 也可以

  • 一、全局配置定义 return array( 'DB_TYPE' => 'mysql', 'DB_HOST' => '127.0.0.1', 'DB_NAME' => 'thinkcmf', 'DB_USER' => 'root', 'DB_PWD' => 'root', 'DB_PORT' => '3306', 'DB_PREFIX' =>

  • ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。数据库抽象访问层基于PDO方式,目前内置包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。 如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。 配置文件

  • 这一节我们编写一个监视器:EventLogMonitor ,也就是用来接收事件的程序,用来代替 netcat 。EventLogMonitor 做下面事情: 接收 LogEventBroadcaster 广播的 UDP DatagramPacket 解码 LogEvent 消息 输出 LogEvent 消息 和之前一样,将实现自定义 ChannelHandler 的逻辑。图13.4描述了LogEv