2015-08-10 22 views
19

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.

+0

To warto przeczytać, ale mało prawdopodobne, aby być twoim przyczyna: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing – fncomp

+0

Czy określić sterownik? Powinien być zgrabny sterownik i sterownik JDBC AFAIK. – fncomp

+2

Dodaj rozdzielczość do pola odpowiedzi i zamknij ją. –

Odpowiedz

1

OP napisał:

EDIT2: Po dalszej kontroli, wydaje się, że wiele połączeń były otwarte, co w końcu doprowadziło do żadnych połączeń będących dostępny. 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.

Powiązane problemy