2017-04-06 44 views
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

根据有关database thread pool的浮油文档:

当使用Database.forConfig时,线程池被配置为di直接在外部配置文件中连同连接参数。

我在这里的假设是,你正在使用连接池(总是在生产环境中推荐的),你有外部的配置文件(一个由configPath简称)在正确配置它。

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

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

有关连接池如何工作以及如何配置(如大小)光滑的更多详细信息,请参阅connection-pools

的addictional照会adding-slick-to-your-project

如果你想用油滑的连接池的支持,你需要HikariCP添加作为一个依赖。