2016-07-06 45 views
3

我從類型安全配置,像這樣建立一個靈活的數據庫對象:回到DB連接到HikariCP池用油滑3.1.X

import com.typesafe.config.Config 

class DatabaseService(configKey: String, config: Config) { 
    val driver = slick.driver.MySQLDriver 
    import driver.api._ 
    val db = Database.forConfig(configKey, config) 
} 

配置對象告訴油滑使用HikariCP,像這樣:

db { 
    numThreads = 5 
    connectionTimeout = 30000 
    maximumPoolSize = 26 
    driver = "com.mysql.jdbc.Driver" 
    url = "jdbc:mysql://localhost:3306/some_db?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false" 
    user = "root" 
    password = "root" 
    connectionPool = "HikariCP" 
} 

實例化DatabaseService後,我可以通過運行dbService.db.run(someQuery)運行查詢。

第一個問題是我需要做些什麼來獲得池中的連接,或者當我調用db.run()時發生在幕後嗎?

其次,一旦該查詢或查詢執行,我該如何將當前數據庫連接返回到連接池?

回答

3

第一個問題是我需要做些什麼來從池中獲得連接,或者當我調用db.run()時發生在幕後?

發生在幕後。

其次,一旦該查詢或查詢執行,我該如何將當前數據庫連接返回到連接池?

這也發生在幕後。

這是relevant code for both questions。基本上,獲得一個會話,執行給定的動作(在你的情況下,someQuery),然後釋放會話(關閉它)。在代碼中進一步挖掘,您可以看到JDBC實現創建了一個BaseSession,其中holds a connectioncloses it when the close method is invoked

此外,從the docs

數據庫連接和事務由油滑的自動管理。默認情況下,連接將按需獲取並釋放,並用於自動提交模式。

+0

非常感謝您在答案中鏈接代碼!你碰巧知道我在哪裏可以找到數據庫類的完整配置選項列表?似乎不是文檔中的一個。 – novon

+0

在[scaladocs,'forConfig'方法](http://slick.lightbend.com/doc/3.1.1/api/index.html#slick.jdbc.JdbcBackend$DatabaseFactoryDe​​[email protected](path:String,config: com.typesafe.config.Config,驅動程序:java.sql.Driver,classLoader:ClassLoader):JdbcBackend.this.Database)(您需要展開方法文檔)。它被鏈接在這裏(http://slick.lightbend.com/doc/3.1.1/database.html)。 – marcospereira

+0

啊我完全錯過了展開圖標。再次感謝! – novon