使用Slick 3.1.x返回到HikariCP池的数据库连接

时间:2016-07-06 23:47:33

标签: scala slick-3.0 hikaricp

我从类型安全配置中设置了一个光滑的数据库对象,如下所示:

import com.typesafe.config.Config

class DatabaseService(configKey: String, config: Config) {
  val driver = slick.driver.MySQLDriver
  import driver.api._
  val db = Database.forConfig(configKey, config)
}

配置对象告诉Slick使用HikariCP,如下所示:

db {
  numThreads = 5
  connectionTimeout = 30000
  maximumPoolSize = 26
  driver = "com.mysql.jdbc.Driver"
  url = "jdbc:mysql://localhost:3306/some_db?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false"
  user = "root"
  password = "root"
  connectionPool = "HikariCP"
}

在实例化DatabaseService之后,我可以通过运行dbService.db.run(someQuery)来运行查询。

第一个问题是我需要做些什么来从池中获取连接,还是在我调用db.run()时在幕后发生这种情况?

其次,一旦该查询或查询执行如何将当前数据库连接返回到连接池?

1 个答案:

答案 0 :(得分:5)

  

第一个问题是我需要做一些事情来从池中获取连接,还是在调用db.run()时在幕后发生这种情况?

这发生在幕后。

  

其次,一旦该查询或查询执行如何将当前数据库连接返回到连接池?

这也发生在幕后。

这是relevant code for both questions。基本上,是获取会话,执行给定的操作(在您的情况下,someQuery),然后释放会话(关闭它)。在代码中进一步挖掘,您可以看到JDBC实现创建了BaseSession holds a connection以及closes it when the close method is invoked

此外,来自the docs

  

Slick自动管理数据库连接和事务。默认情况下,按需获取和释放连接,并在自动提交模式下使用。