Il "modo giusto" per fare streaming con Slick e Postgres include tre cose:
-
Deve utilizzare db.stream()
-
Devi disabilitare
autoCommit
nel driver JDBC. Un modo è fare in modo che la query venga eseguita in una transazione inserendo il suffisso.transactionally
. -
Devi impostare
fetchSize
essere qualcosa di diverso da 0, altrimenti postgres invierà l'intero resultSet al client in una volta sola.
Es:
DB.stream(
find(0L, 0L)
.transactionally
.withStatementParameters(fetchSize = 1000)
).foreach(println)
Link utili:
https://github.com/slick/slick/issues/1038
https://github.com/slick/slick/issues/809