2017-04-06 50 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添加作爲一個依賴。