【问题标题】:Facing Too many connection issue on HIkariCP在 HIkariCP 上面临太多连接问题
【发布时间】:2018-12-21 19:59:17
【问题描述】:

我有一个 Java JDBC 应用程序,在对 Select Jetty 服务器进行 100 次查询后崩溃并返回以下错误:

     ERROR com.zaxxer.hikari.pool.HikariPool - dev-server - Exception during pool initialization.
java.sql.SQLNonTransientConnectionException: Too many connections
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:526)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1606)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:633)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:347)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:219)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:95)
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358)
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:443)
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:514)
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:111)
        at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:72)
        at com.jrg.platform.commons.hikari.HikariDataSourceSupport.getDataSource(HikariDataSourceSupport.java:70)
        at com.jrg.platform.commons.hikari.HikariDataSourceSupport.getConnection(HikariDataSourceSupport.java:82)
        at com.jrg.platform.services.internal.pcms.data.campaign.CampaignAlertDaoImpl.getCampaignAlerts(CampaignAlertDaoImpl.java:40)
        at com.jrg.platform.services.internal.pcms.service.CampaignAlertServiceImpl.campaignAlerts(CampaignAlertServiceImpl.java:43)
        at com.jrg.platform.services.internal.pcms.resource.CampaignAlertResource.getCampaignAlerts(CampaignAlertResource.java:52)
        at com.jrg.platform.services.internal.pcms.resource.CampaignAlertResource_$$_jvstf5a_6._d5getCampaignAlerts(CampaignAlertResource_$$_jvstf5a_6.java)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

无法找到解决方案。我只是从 HikariDataSourceSupport 获得连接并执行查询。 获取连接的示例代码如下:

default HikariDataSource getDataSource(E e, boolean readOnly) throws IOException {
        String key = this.getKey(e, readOnly);
        Map<String, HikariDataSource> sources = this.getDataSources();
        if(!sources.containsKey(key)) {
            synchronized(this.getMonitor()) {
                if(!sources.containsKey(key)) {
                    if(logger.isDebugEnabled()) {
                        logger.debug("creating new DataSource for {}", key);
                    }

                    Config config = this.getConfig(e, readOnly);
                    if(!config.hasPathOrNull("jdbcUrl")) {
                        throw new EnvironmentNotConfigured(e, readOnly);
                    }

                    sources.put(key, new HikariDataSource(new HikariConfig(ConfigUtils.asProperties(config))));
                }
            }
        }

        return (HikariDataSource)sources.get(key);
    }

    default Connection getConnection(E env, boolean readOnly) throws SQLException, IOException {
        return this.getDataSource(env, readOnly).getConnection();
    }

【问题讨论】:

  • close你的连接,以便它可以在池中返回?
  • 在获得连接时,我正在最终阻止关闭。但又发生了。如果您根据我的代码知道任何其他方法,那么这对我来说将是资产。
  • 听起来你为当前的 MySQL 配置创建了太多的连接,也许你创建了太多的数据源(反过来又创建了太多的连接)。没有minimal reproducible example,这很难说。
  • 听起来你每次都在关闭 POOL。该异常仅在池初始化期间发生,并且在 100 次查询后不可能遇到。因此,您必须创建和关闭 POOLS 而不是 CONNECTIONS。
  • @brettw 我什至猜他每次都在创建池,但从不关闭这些池。

标签: jdbc hikaricp


【解决方案1】:

HikariCP 配置有问题。当请求生成并尝试获取连接时,create connection 方法正在创建新的数据源,因为由于 bean 的视图范围,最后一个状态被破坏。

现在我已经将该类转换为 singalton 并创建了该接口的实现以注入代码。它正在保存先前数据源连接的状态。现在它可以在最少的空闲连接下完美运行。

代码可以在这里看到: APP.java

 bind(HikariLucktasticDataSourceSupportImpl.class)
                        .to(HikariDataSourceSupport.class)
                        .named("hdsSupport")
                        .in(Singleton.class);

在 DAO 层中:

   @Inject
    @Named("hdsSupport")
    private HikariDataSourceSupport hdsSupport;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 2011-08-24
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多