【问题标题】:Hikari connection pool creates two connection after startingHikari 连接池启动后创建两个连接
【发布时间】:2019-09-20 11:32:55
【问题描述】:

我使用 Hikary 连接池,设置如下:

  HikariDataSource dataSource = new HikariDataSource();
        dataSource.setMinimumIdle(0);
        dataSource.setMaximumPoolSize(Integer.MAX_VALUE);
        dataSource.setJdbcUrl(jdbcConnectionString);
        dataSource.setConnectionTestQuery("select 1");
        dataSource.setIdleTimeout(TimeUnit.SECONDS.toMillis(60));
    dataSource.getConnection();

在 getConnection() 之后 hikari 尝试获取到实例的 2 个连接,但在连接池中只放入一个连接。我该如何解决?光版本是3.4.0

【问题讨论】:

  • 只有 一个 连接的连接 pool 有什么意义?
  • 我不知道。我不使用它。如果你找到答案,请告诉我
  • 我说得对吗,getConnection 返回 一个 连接对象,但是您看到在数据库中打开了 两个 连接?如果您坚持一个连接池,您可以尝试将maximum-pool-size 设置为1。
  • 是的,hikari 第一次在某处创建了两个连接,但在连接池中只添加了一个
  • 你不应该这样做:setMaximumPoolSize(Integer.MAX_VALUE)。将其限制在一个合理的数字(例如,5 或 10 用于小容量应用程序,并在您的应用程序需要时“扩展”)。

标签: java jdbc hikaricp


【解决方案1】:

我找到了答案。 Hikari 在 checkFailFast 方法中创建第一个连接。当找到如何禁用此方法时,我会更新此评论。如果initializationFailTimeoutcheckFailFast 不起作用。对我有帮助

【讨论】:

    【解决方案2】:

    在 getConnection() 之后 hikari 尝试获得 2 个到实例的连接,但在连接池中只放入一个连接。我该如何解决?

    这种行为没有什么可修复的。这简单的意思是,打开了两个连接,其中一个关闭了。

    第二个连接被关闭的原因是你设置了setMinimumIdle(0),即池中没有空闲连接被维护,所有空闲连接都被关闭。

    如果您想查看池中的两个连接,只需设置setMinimumIdle(1)。调用DataSource.getConnection() 后,池中将有两个连接——一个是你的,一个是空闲的。

    如果你根本不想打开第二个连接,设置

        config.setMinimumIdle( 1 );
        config.setMaximumPoolSize( 1 );
    

    但是三思而后行,为什么要使用只有一个连接的连接池。

    您可以在以后在池运行时增加这两个参数。

     HikariConfigMXBean bn = DataSource.ds.getHikariConfigMXBean()
     bn.setMaximumPoolSize(10)
     bn.setMinimumIdle(10)
    

    这将(不是立即)打开 9 个额外的数据库连接。

    请注意,在设置MaximumPoolSize == MinimumIdle 时,池中的连接数保持稳定,没有打开或关闭连接,这可能是您要观察的事情。

    用Hicari 3.4.0和Oracle 12.2测试

    【讨论】:

    • 我找到了这个问题的解决方案。你可以在我的回答中找到。您也可以在代码中检查它
    猜你喜欢
    • 2022-01-23
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 2023-02-10
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多