Domanda Scala / Slick, errore "Timeout dopo 20000 ms di attesa per una connessione"


Il blocco di codice riportato di seguito ha generato un errore.

  Timeout after 20000ms of waiting for a connection.","stackTrace":[{"file":"BaseHikariPool.java","line":228,"className":"com.zaxxer.hikari.pool.BaseHikariPool","method":"getConnection"

Inoltre, i miei accessi al database sembrano troppo lenti, con ogni elemento di xs.map () che richiede circa 1 secondo. Sotto, getFutureItem () chiama db.run ().

xs.map{ x => 
    val item: Future[List[Sometype], List(Tables.myRow)] = getFutureItem(x)         
    Await.valueAfter(item, 100.seconds) match {
        case Some(i) => i
        case None => println("Timeout getting items after 100 seconds")
    }
}

Slick registra questo con ogni iterazione di un valore "x":

[akka.actor.default-dispatcher-3] [akka://user/IO-HTTP/listener-0/24] Connection was PeerClosed, awaiting TcpConnection termination...
[akka.actor.default-dispatcher-3] [akka://user/IO-HTTP/listener-0/24] TcpConnection terminated, stopping
[akka.actor.default-dispatcher-3] [akka://system/IO-TCP/selectors/$a/0] New connection accepted
[akka.actor.default-dispatcher-7] [akka://user/IO-HTTP/listener-0/25] Dispatching POST request to http://localhost:8080/progress to handler Actor[akka://system/IO-TCP/selectors/$a/26#-934408297]

La mia configurazione:

"com.zaxxer" % "HikariCP" % "2.3.2"

default_db {
  url = ...
  user = ...
  password = ...
  queueSize = -1
  numThreads = 16
  connectionPool = HikariCP
  connectionTimeout = 20000
  maxConnections = 40
}

C'è qualcosa di ovvio che sto sbagliando che sta facendo sì che questi accessi al database siano così lenti e generino questo errore? Posso fornire ulteriori informazioni se necessario.

EDIT: Ho ricevuto una raccomandazione che il problema potrebbe essere un errore del classloader e che potrei risolverlo distribuendo il progetto come singolo .jar, piuttosto che eseguirlo con sbt.

EDIT2: dopo ulteriori ispezioni, sembra che molte connessioni siano state lasciate aperte, il che ha portato alla fine alla mancanza di connessioni disponibili. Questo può essere risolto chiamando db.close () per chiudere la connessione al momento opportuno.

EDIT3: risolto. Le connessioni fatte da slick hanno superato le connessioni massime consentite dalla mia configurazione mysql.


19
2017-08-10 22:39


origine


risposte:


OP ha scritto:

EDIT2: dopo ulteriori ispezioni, sembra che molte connessioni siano state lasciate aperte, il che ha portato alla fine alla mancanza di connessioni disponibili. Questo può essere risolto chiamando db.close () per chiudere la connessione al momento opportuno.

EDIT3: risolto. Le connessioni fatte da slick hanno superato le connessioni massime consentite dalla mia configurazione mysql.


1