【问题标题】:Returning db connection to HikariCP pool with Slick 3.1.x使用 Slick 3.1.x 将数据库连接返回到 HikariCP 池
【发布时间】:2016-11-09 04:31:52
【问题描述】:

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

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() 时,这是否会在幕后发生?

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

【问题讨论】:

    标签: scala slick-3.0 hikaricp


    【解决方案1】:

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

    这发生在幕后。

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

    这也发生在幕后。

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

    另外,来自the docs

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

    【讨论】:

    • 非常感谢您在答案中链接代码!您是否知道我在哪里可以找到 Database 类的完整配置选项列表?文档中似乎没有。
    • the scaladocs, forConfig method(需要扩展方法文档)。它已链接here
    • 啊,我完全错过了那个展开图标。再次感谢!
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多