我正在实例化一个代码类似于
的光滑数据库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)
提前感谢您的考虑和回应
答案 0 :(得分:1)
根据关于database thread pool的Slick文档:
使用
Database.forConfig
时,线程池直接在外部配置文件中与连接参数一起配置。
我的假设是您正在使用连接池(在生产环境中始终建议使用),并且您已在外部配置文件(由configPath
引用的文件)中正确配置它。
您不必担心数据库连接,因为您的Database
对象(您的db
)正在为您管理。
对db.stream()
的每次调用实际上都使用(并撤销)池中的连接(最终根据池大小和配置打开一个新连接),然后将其释放回池中。
有关连接池如何工作以及如何配置(例如尺寸)的详细信息,可以在connection-pools找到它。
来自adding-slick-to-your-project的成瘾说明:
如果您想使用Slick的连接池支持,则需要添加HikariCP作为依赖项。