2017-10-17 126 views
0

我使用Slick 3和Akka Streams從mysql中傳輸數據。Akka Streams Hikari連接池用於MySQL流式傳輸

這是我建立我的源

import slick.jdbc.MySQLProfile.api._ 
val enableJdbcStreaming: (java.sql.Statement) => Unit = {statement => 
    if (statement.isWrapperFor(classOf[com.mysql.cj.jdbc.StatementImpl])) { 
     statement.unwrap(classOf[com.mysql.cj.jdbc.StatementImpl]).enableStreamingResults() 
    } 
    } 
val query = Tables.Foo.filter(r => r.isActive === true) 
    .map(r => r.id).result.withStatementParameters(statementInit = enableJdbcStreaming) 
Source.fromPublisher(db.stream(query)) 

我的應用程序運行像20分鐘,然後關閉並出現以下錯誤

[error] Exception in thread "abhipool network timeout executor" java.lang.NullPointerException 
[info] 15:31:46 INFO [HikariPool] - abhipool - Close initiated... 
[error]  at com.mysql.cj.mysqla.io.MysqlaProtocol.setSocketTimeout(MysqlaProtocol.java:1397) 
[error]  at com.mysql.cj.mysqla.MysqlaSession$1.run(MysqlaSession.java:401) 
[error]  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
[error]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
[error]  at java.lang.Thread.run(Thread.java:745) 

我有一種感覺,因爲我的查詢是運行很長一段時間,會有某種超時發生,正在啓動關閉。

我的連接

mysql { 
    profile = "slick.jdbc.MySQLProfile$" 
    dataSourceClass = "slick.jdbc.DatabaseUrlDataSource" 
    properties { 
    driver = "com.mysql.cj.jdbc.Driver" 
    url = "jdbc:mysql://foo:3306/bar?useLegacyDatetimeCode=false&serverTimezone=America/Chicago" 
    user = "foo" 
    password = "bar" 
    } 
    connectionTimeout = 0 
    idleTimeout = 0 
    maxLifetime = 0 
    maxConnections = 40 
    minConnections = 10 
    poolName = "abhipool" 
    numThreads = 10 
} 

依賴

"com.typesafe.slick" %% "slick" % "3.2.1", 
"com.typesafe.slick" %% "slick-hikaricp" % "3.2.1", 
"mysql" % "mysql-connector-java" % "6.0.6", 

我如何配置我的應用程序的數據庫連接,這樣即使我好幾天流應用流的數據......它繼續運行。

關於同一問題here有一個非常冗長的對話,但它並沒有告訴我如何真正解決這個問題。這個問題使得編寫長時間運行的使用Mysql作爲源的流式任務是完全不可能的。

回答

0

您可以通過在URL

url = "jdbc:mysql://foo:3306/bar?useLegacyDatetimeCode=false&serverTimezone=America/Chicago&socketTimeout=30000" 

我把30000的例子着想添加參數配置MySQL驅動,把適合您的需要

+0

30000後會發生什麼是正確的價值?我的工作將持續幾天。 –

+0

然後更改值,以便它是一個星期,或者我錯過了什麼? – n1r3