【问题标题】:Slick Database Instantiation And Connection Pool LogicSlick 数据库实例化和连接池逻辑
【发布时间】:2017-04-06 14:08:00
【问题描述】:

我正在使用类似于

的代码实例化一个光滑的数据库
import slick.jdbc.JdbcBackend.Database

val db : Database =  Database forConfig "configPath"

查询是由一个函数构造的,该函数接受一个用户 ID 并从数据库表中返回一个用户名:

def queryName(userId : String) =
  for {
    row <- TableQuery[Tables.MyTable] if row.userid === userId
  } yield row.username

然后运行查询以产生不同的Publisher 值:

val p1 : Publisher[String] = db stream (queryName("foo").result)

val p2 : Publisher[String] = db stream (queryName("bar").result)

最后,我的问题是:多次调用db.stream 是否使用连接池中的同一个连接?

换句话说,一旦我实例化了数据库,这与锁定单个连接是一样的吗?

这意味着要真正利用池中的所有连接,需要一个函数在查询之前创建Database 值:

//Is this necessary?

val db = () => Database forConfig "configPath"

val p1 = db() stream (queryName("foo").result)

提前感谢您的考虑和回复

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:

    根据关于database thread pool的Slick文档:

    使用Database.forConfig时,线程池与连接参数一起直接在外部配置文件中配置。

    我在这里的假设是您正在使用连接池(在生产环境中始终推荐)并且您已在外部配置文件(configPath 引用的那个)中正确配置它。

    您不必担心数据库连接,因为您的 Database 对象(您的 db)正在为您管理。

    对db.stream() 的每次调用实际上都使用(并撤回)池中的一个连接(最终根据池大小和配置打开一个新连接),然后将其释放回池中。

    有关连接池如何工作以及如何在 slick 中配置(例如大小)的更多详细信息,请访问connection-pools。

    来自adding-slick-to-your-project的成瘾笔记:

    如果要使用 Slick 的连接池支持,需要添加 HikariCP 作为依赖。

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 1970-01-01
      • 2010-09-22
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多