2017-10-17 7 views
0

Je diffuse des données de mysql en utilisant Slick 3 et Akka Streams.Akka Streams Hikari Connexion Pool pour MySQL Streaming

Voici comment je construis ma source

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)) 

Mon application dure comme 20 minutes et puis arrête avec l'erreur suivante

[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) 

J'ai le sentiment que parce que ma requête est en cours d'exécution pendant très longtemps, il se produit un certain délai d'attente qui déclenche cette fermeture.

Ma connexion

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 
} 

dépendances

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

Comment puis-je configurer mes connexions de base de données d'application de sorte que même si mes ruisseaux applications de streaming des données pendant plusieurs jours ... il continue à courir.

Il ya une conversation extrêmement longue sur ce même problème here mais il ne me dit pas comment résoudre ce problème. Ce problème rend totalement impossible l'écriture de tâches de diffusion en continu qui utilisent Mysql comme source.

Répondre

0

Vous pouvez configurer le pilote MySQL en ajoutant des paramètres dans l'URL

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

Je mets 30000 pour le bien de l'exemple, mettre la bonne valeur qui correspond à votre besoin

+0

ce qui se passe après 30000? mon travail durera des jours. –

+0

alors changez la valeur pour que ce soit une semaine, ou est-ce que je manque quelque chose? – n1r3