光滑的数据库实例化和连接池逻辑

时间:2017-04-06 14:08:00

标签: scala slick slick-3.0

我正在实例化一个代码类似于

的光滑数据库
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)

提前感谢您的考虑和回应

1 个答案:

答案 0 :(得分:1)

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

  

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

我的假设是您正在使用连接池(在生产环境中始终建议使用),并且您已在外部配置文件(由configPath引用的文件)中正确配置它。

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

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

有关连接池如何工作以及如何配置(例如尺寸)的详细信息,可以在connection-pools找到它。

来自adding-slick-to-your-project的成瘾说明:

  

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