Blok kodu poniżej rzucił błąd.Scala/Slick, "Czas oczekiwania po 20000ms oczekiwania na połączenie" błąd
Timeout after 20000ms of waiting for a connection.","stackTrace":[{"file":"BaseHikariPool.java","line":228,"className":"com.zaxxer.hikari.pool.BaseHikariPool","method":"getConnection"
Również moi dostępy bazy danych wydaje się zbyt wolno, z każdego elementu xs.map() biorąc około 1 sekundę. Poniżej getFutureItem() wywołuje funkcję 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 logi to z każdej iteracji "x" wartość:
[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]
Moja konfiguracja:
"com.zaxxer" % "HikariCP" % "2.3.2"
default_db {
url = ...
user = ...
password = ...
queueSize = -1
numThreads = 16
connectionPool = HikariCP
connectionTimeout = 20000
maxConnections = 40
}
Czy jest coś oczywiste, że robię źle, że jest przyczyną baza danych uzyskuje dostęp tak wolno i wyrzuca ten błąd? W razie potrzeby mogę podać więcej informacji.
EDYCJA: Otrzymałem jedną rekomendację, że przyczyną może być błąd programu ładującego klasy, i że można go rozwiązać, wdrażając projekt jako pojedynczy .jar, zamiast uruchamiać go z sbt.
EDIT2: Po dalszej inspekcji okazało się, że wiele połączeń pozostało otwartych, co ostatecznie doprowadziło do braku dostępnych połączeń. Można to prawdopodobnie rozwiązać, wywołując funkcję db.close(), aby zamknąć połączenie we właściwym czasie.
EDIT3: Rozwiązany. Połączenia wykonane przez slick przekroczyły maksymalne połączenia dozwolone przez moją konfigurację mysql.
To warto przeczytać, ale mało prawdopodobne, aby być twoim przyczyna: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing – fncomp
Czy określić sterownik? Powinien być zgrabny sterownik i sterownik JDBC AFAIK. – fncomp
Dodaj rozdzielczość do pola odpowiedzi i zamknij ją. –