2015-12-22 160 views
3

我使用圓滑3.0.0-M1以「com.zaxxer」%「HikariCP」%「2.4.3」油滑預處理語句

油滑正準備爲每個查詢語句(伐木表示)這是壞:

"Preparing statement: select * from ..." 

我的配置告訴柔滑/阿光緩存準備好的發言:

myDB { 
    url = "jdbc:mysql://... 
    user = ... 
    ... 
    connectionPool = HikariCP 
    queueSize = 50000 
    maxConnections = 50 
    properties.cachePrepStmts = true 
    properties.prepStmtCacheSize = 20000 
    properties.prepStmtCacheSqlLimit = 100000 
} 

日誌似乎表明這些屬性是隻讀:

configuration: 
... 
dataSourceName.................. 
dataSourceClassName............. 
dataSourceProperties............ 
    {password=<masked>, 
    prepStmtCacheSqlLimit=100000, 
    cachePrepStmts=true, 
    prepStmtCacheSize=20000} 
maximumPoolSize.................50 
poolName.......................... 

的分貝對象被實例化,並在試驗中使用:

val db = Database.forConfig("", config.getConfig("myDB")) 
val qTemplate = StaticQuery[(Int), MyRow] + "select * from table_name where num=?" 
db.withSession{ implicit session => 
    (0 until 100).foreach{ case i => 
     qTemplate(2).foreach(println) 
    } 
} 

對於每次調用qTemplate(2),光滑日誌'準備聲明...'爲什麼模板沒有被緩存?

回答

0

首先,我建議你使用像3.1.1這樣的生產版本,如果你想要最新的。 http://slick.typesafe.com/

通常,連接池執行連接緩存,數據庫執行語句緩存。使用帶有佔位符的PreparedStatement?應該足以讓MySql緩存該語句。數據庫必須解析語句,並且每個語句對於數據庫來說必須看起來相同才能緩存語句。讓數據庫避免用不同的參數值反覆解析相同的語句是該特性避免的。

如果你看一下有關語句緩存也將有助於解釋文檔 - https://github.com/brettwooldridge/HikariCP - 有關於MySQL這裏還有一些更多的信息 - https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration

我只想升級光滑,繼續做你正在做什麼。

Eric

+0

該文檔說,Slick儘可能使用準備好的語句,但它不會自行緩存它們。因此,您應該在連接池的配置中啓用準備好的語句緩存。 – user2827214

+1

我在這裏看到你指的是什麼 - http://slick.typesafe.com/doc/3.1.1/database.html - 來自Slick團隊的人可能需要澄清。如果您不使用直接SQL,那麼Slick會生成SQL,因此它們可能指的是Slick生成的SQL。我理解它的方式是將SQL和params通過驅動程序傳遞給數據庫。然後數據庫可以查找已解析的語句,並使用參數數據執行語句而不解析語句。 – ekrich

+0

我調查了更多,似乎這些參數化語句正在工作。 – user2827214