You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Database.forConfig初始化Slick+HikariCP连接池失败求助

问题:使用Slick+HikariCP实现连接池时获取连接超时

已引入的依赖

"com.typesafe.slick" %% "slick" % Version.slick
"com.typesafe.slick" %% "slick-hikaricp" % Version.slick

数据库初始化实现

实现了两种初始化方式,其中基于配置的连接池方式无法正常工作,手动构建的方式可运行但未使用连接池:

/** 无法正常工作,异常信息见下方 */
def createPooledDatabase(): Database = {
  Database.forConfig("myConfig.jdbc")
}

/** 可正常运行,但未使用连接池 */
def createDatabase(): Database = {
  val config: Config = ConfigFactory.load().getConfig("myConfig.jdbc")
  val driver = config.getString("driver")
  val url = config.getString("url")
  val user = config.getString("user")
  val password = config.getString("password")
  Database.forURL(url, user = user, password = password, driver = driver)
}

异常信息

调用createPooledDatabase()初始化后,执行第一条SQL时抛出以下超时异常:

java.sql.SQLTransientConnectionException: rental-connect.jdbc - Connection is not available, request timed out after 30000ms.
        at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:676)
        at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:190)
        at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:155)
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:100)
        at slick.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:14)
        at slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:494)
        at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:46)
        at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:37)
        at slick.basic.BasicBackend$DatabaseDef.acquireSession(BasicBackend.scala:250)
        at slick.basic.BasicBackend$DatabaseDef.acquireSession$(BasicBackend.scala:249)
        at slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:37)
        at slick.basic.BasicBackend$DatabaseDef$$anon$3.run(BasicBackend.scala:275)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:750)

可能的原因分析

  • 配置结构不符合要求:Database.forConfig需要严格遵循Slick+HikariCP的配置层级。如果你的myConfig.jdbc下直接配置了driver、url等参数,而非嵌套在properties节点下,Hikari无法正确解析连接参数,导致无法创建连接池。正确的配置结构示例:
    myConfig {
      jdbc {
        dataSourceClass = "com.mysql.cj.jdbc.MysqlDataSource"
        properties {
          driver = "com.mysql.cj.jdbc.Driver"
          url = "jdbc:mysql://localhost:3306/your_db"
          user = "db_user"
          password = "db_pass"
        }
        connectionTimeout = 30000
        maximumPoolSize = 10
      }
    }
    
  • 配置参数不一致:检查myConfig.jdbc下的参数是否和手动读取的一致,比如是否存在拼写错误(如url写成uri),导致Hikari使用错误的参数尝试连接数据库,最终超时。
  • 数据库连接不可达:虽然手动方式能连接,但连接池初始化时可能因为数据库服务临时异常、网络波动、防火墙限制等原因无法创建初始连接,Hikari会在第一次获取连接时抛出超时异常。可以尝试直接用配置中的参数手动连接测试。
  • 版本兼容性问题:确认Slick版本和其依赖的HikariCP版本兼容,部分Slick版本对HikariCP的版本有特定要求,版本不匹配可能导致连接池初始化失败。

内容的提问来源于stack exchange,提问作者Frank Endriss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:09:50