使用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
相关产品推荐
相关产品推荐

