2015-08-10 9 views
19

Der folgende Codeblock hat einen Fehler verursacht.Scala/Slick, "Timeout nach 20000ms Warten auf eine Verbindung" Fehler

Auch scheinen meine Datenbankzugriffe zu langsam, mit jedem Element von xs.map() dauert etwa 1 Sekunde. Unten ruft getFutureItem() db.run() auf.

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 protokolliert diese mit jeder Iteration von einem "x" Wert:

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

Meine Konfiguration:

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

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

Gibt es etwas offensichtlich, dass ich falsch mache, die verursacht wird, diese Datenbankzugriffe sind so langsam und werfen diesen Fehler? Ich kann bei Bedarf weitere Informationen bereitstellen.

EDIT: Ich habe eine Empfehlung erhalten, dass das Problem ein Classloader-Fehler sein könnte, und dass ich es lösen könnte, indem Sie das Projekt als einzelnes .jar bereitstellen, anstatt es mit sbt auszuführen.

EDIT2: Nach einer weiteren Überprüfung scheint es, dass viele Verbindungen offen blieben, was schließlich dazu führte, dass keine Verbindungen mehr verfügbar waren. Dies kann wahrscheinlich durch Aufrufen von db.close() gelöst werden, um die Verbindung zum richtigen Zeitpunkt zu schließen.

EDIT3: Gelöst. Die von slick gemachten Verbindungen überschritten die maximalen Verbindungen, die meine mysql config erlaubt.

+0

Dies ist lesenswert, aber unwahrscheinlich, dass Ihre Ursache sein: https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing – fncomp

+0

Haben Sie einen Treiber angeben? Es sollte einen schicken Treiber und einen JDBC-Treiber AFAIK geben. – fncomp

+2

Bitte fügen Sie die Auflösung zum Antwortfeld hinzu und schließen Sie es. –

Antwort

1

OP schrieb:

EDIT2: Nach einer weiteren Inspektion, scheint es, dass viele Verbindungen wurden offen gelassen wird, was schließlich zu keinen Verbindungen führte zur Verfügung stehen. Dies kann wahrscheinlich durch Aufrufen von db.close() gelöst werden, um die Verbindung zum richtigen Zeitpunkt zu schließen.

EDIT3: Gelöst. Die von slick gemachten Verbindungen überschritten die maximalen Verbindungen, die meine mysql config erlaubt.