流畅的数据库实例化和连接池逻辑

Slick Database Instantiation And Connection Pool Logic

我正在使用类似于

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

val db : Database =  Database forConfig "configPath"

查询是由一个函数构造的,该函数接受用户 ID 和 returns 来自数据库的用户名 table:

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)

提前感谢您的考虑和回复

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

When using Database.forConfig, the thread pool is configured directly in the external configuration file together with the connection parameters.

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

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

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

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

来自 adding-slick-to-your-project 的令人上瘾的笔记:

If you want to use Slick’s connection pool support, you need to add HikariCP as a dependency.