由于 Hikari Cp 池初始化失败,HikariCP 与 jooq 的连接过多

发布于 2025-01-15 10:56:36 字数 3312 浏览 3 评论 0原文

我有一个内置于 spring boot (2.4.5v) 的服务,它与 jooq 集成。当我们在服务中执行加载时,我们与 Jooq 的连接过多。

我正在使用这样的 DSL 上下文。

public class CourseRepository {
  @Autowired private DSLContext dslContext;
}

而且我还没有提供 DSLContext 的显式 bean。

和 Hikari CP 配置看起来像这样,

spring.datasource.url=[My RDS URL]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jooq.sql-dialect=MySQL
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.pool-name=[DB Name]
spring.datasource.hikari.initial-size=5
spring.datasource.hikari.maximum-pool-size=40
spring.datasource.hikari.minimum-idle=2
spring.datasource.hikari.idle-timeout=10000
spring.datasource.timeout=10000

错误堆栈

error.class:java.sql.SQLNonTransientConnectionException
error.message:Too many connections
error.stack: at
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) at 
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMappi
ng.java:122) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833) 
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453) at 
com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) at 
com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) at 
com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at 
com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) at 
com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) at 
com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)


另一个错误

error.class:org.springframework.dao.DataAccessResourceFailureException
error.message:jOOQ; SQL [Query]; Too many connections; nested exception is java.sql.SQLNonTransientConnectionException: Too many connections

阅读几个链接和帖子后,我发现我们必须提供 DSLContext bean,

 @Primary
    @Bean(name = "dslContext")
    public DSLContext dslContext(@Qualifier("dataSource") DataSource dataSource) {
        this.dataSource = dataSource;
        log.info("Datasource {}", dataSource);
        org.jooq.Configuration config = new DefaultConfiguration();
        config.set(dataSource);
        config.set(SQLDialect.MYSQL);
        return DSL.using(config);
    }

添加这些配置后],我收到不同的错误。

error.class:org.jooq.exception.DataAccessException
error.message:Error getting connection from data source HikariDataSource (CorsairServiceDB)
error.stack: at org.jooq_3.13.2.MYSQL.debug(Unknown Source) at org.jooq.impl.DataSourceConnectionProvider.acquire(DataSourceConnectionProvider.java:86) at org.jooq.impl.DefaultExecuteContext.connection(DefaultExecuteContext.java:647) at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:334) at org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:354) at org.jooq.impl.AbstractResultQuery.fetchInto(AbstractResultQuery.java:1550) at org.jooq.impl.SelectImpl.fetchInto(SelectImpl.java:3746) at com.xyz.dao.CourseRepository.getCoursesByIds(CourseRepository.java:799) at com.xyz.dao.CourseRepository$$FastClassBySpringCGLIB$$b22a30cd.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)

I have service which is built in spring boot (2.4.5v) and its integrated with and jooq. When we perform the load in our service we are getting too many connection with Jooq.

I am using the DSL context like this.

public class CourseRepository {
  @Autowired private DSLContext dslContext;
}

And I haven't provide explicit bean of DSLContext.

and Hikari CP configuration look like this,

spring.datasource.url=[My RDS URL]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jooq.sql-dialect=MySQL
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.pool-name=[DB Name]
spring.datasource.hikari.initial-size=5
spring.datasource.hikari.maximum-pool-size=40
spring.datasource.hikari.minimum-idle=2
spring.datasource.hikari.idle-timeout=10000
spring.datasource.timeout=10000

Error Stack

error.class:java.sql.SQLNonTransientConnectionException
error.message:Too many connections
error.stack: at
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) at 
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMappi
ng.java:122) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833) 
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453) at 
com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) at 
com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) at 
com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at 
com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) at 
com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) at 
com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477)


Another Error

error.class:org.springframework.dao.DataAccessResourceFailureException
error.message:jOOQ; SQL [Query]; Too many connections; nested exception is java.sql.SQLNonTransientConnectionException: Too many connections

After reading several links and post, I found we have to provide the DSLContext bean,

 @Primary
    @Bean(name = "dslContext")
    public DSLContext dslContext(@Qualifier("dataSource") DataSource dataSource) {
        this.dataSource = dataSource;
        log.info("Datasource {}", dataSource);
        org.jooq.Configuration config = new DefaultConfiguration();
        config.set(dataSource);
        config.set(SQLDialect.MYSQL);
        return DSL.using(config);
    }

After adding these configuration ], I am getting different error.

error.class:org.jooq.exception.DataAccessException
error.message:Error getting connection from data source HikariDataSource (CorsairServiceDB)
error.stack: at org.jooq_3.13.2.MYSQL.debug(Unknown Source) at org.jooq.impl.DataSourceConnectionProvider.acquire(DataSourceConnectionProvider.java:86) at org.jooq.impl.DefaultExecuteContext.connection(DefaultExecuteContext.java:647) at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:334) at org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:354) at org.jooq.impl.AbstractResultQuery.fetchInto(AbstractResultQuery.java:1550) at org.jooq.impl.SelectImpl.fetchInto(SelectImpl.java:3746) at com.xyz.dao.CourseRepository.getCoursesByIds(CourseRepository.java:799) at com.xyz.dao.CourseRepository$FastClassBySpringCGLIB$b22a30cd.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文