In Slick / Scala streamen
Ich schaue mir Scala / Slick-Streaming an und versuche zu verstehen, wie es funktioniert. Hier ist mein Testcode
val bigdata = TableQuery[BigData]
val x = db.stream(bigdata.result.transactionally.withStatementParameters(fetchSize = 100)).foreach {
(tuple: (Int, UUID)) =>
println(tuple._1 + " " + tuple._2)
Thread.sleep(50)//emulating slow consumer.
}
Await.result(x, 100000 seconds)
Während der Code ausgeführt wird, habe ich das postgresql-Abfrageprotokoll aktiviert, um zu verstehen, was unter der Haube läuft. Ich sehe alle 100 Elemente eine erneute Abfrage
2015-11-06 15:03:24 IST [24379-3] postgres @ scala_test LOG: Abruf von S_2 / C_3 ausführen: x2 auswählen. "Id", x2. "Data" von "bigdata" x2 2015-11- 06 15:03:29 IST [24379-4] postgres @ scala_test LOG: execute
fetch from S_2/C_3: select x2."id", x2."data" from "bigdata" x2
2015-11-06 15:03:34 IST [24379-5] postgres@scala_test LOG: execute fetch from S_2/C_3: select x2."id", x2."data" from "bigdata" x2
2015-11-06 15:03:39 IST [24379-6] postgres@scala_test LOG: execute fetch from S_2/C_3: select x2."id", x2."data" from "bigdata" x2
2015-11-06 15:03:44 IST [24379-7] postgres@scala_test LOG: execute fetch from S_2/C_3: select x2."id", x2."data" from "bigdata" x2
2015-11-06 15:03:49 IST [24379-8] postgres@scala_test LOG: execute fetch from S_2/C_3: select x2."id", x2."data" from "bigdata" x2
Es sieht jedoch so aus, als würde der gesamte Datensatz abgerufen. Ich habe eine Abfrage mit Offset erwartet.
ie SELECT * FROM bigdata LIMIT 100 OFFSET 500
Sieht so aus, als ob alles abgefragt und Sendedaten teilweise gesendet werden.
Während das Streaming oben ausgeführt wird, habe ich einen neuen Datensatz in dieselbe Tabelle eingefügt.
Vor dem Streaming
SELECT count(*) FROM bigdata -> 500
Dann einige Zeilen eingefügt
SELECT count(*) FROM bigdata -> 700
Aber das Streaming stoppt bei 500. Dies scheint darauf hinzudeuten, dass neue Daten niemals abgerufen und zurückgestreamt werden. Irgendwelche Ideen, wie Streaming in Slick funktioniert.