Я пытаюсь понять, как работать с гладкой потоковой передачей. Я использую slick 3.0.0 с драйвером postgres.
Ситуация следующая: сервер должен отдавать клиенту последовательности данных, разбитых на чанки, ограниченные по размеру (в байтах). Итак, я написал следующий гладкий запрос:
val sequences = TableQuery[Sequences]
def find(userId: Long, timestamp: Long) = sequences.filter(s ⇒ s.userId === userId && s.timestamp > timestamp).sortBy(_.timestamp.asc).result
val seq = db.stream(find(0L, 0L))
Я объединил seq с akka-streams Source
, написал пользовательский PushPullStage
, который ограничивает размер данных (в байтах) и завершается вверх по течению, когда он достигает предела размера. Это работает просто отлично. Проблема в том, что когда я смотрю в журналы postgres, я вижу такой запрос select * from sequences where user_id = 0 and timestamp > 0 order by timestamp;
Таким образом, на первый взгляд кажется, что выполняется много (и ненужных) запросов к базе данных, только для использования нескольких байтов в каждом запросе. Как правильно выполнять потоковую передачу с помощью Slick, чтобы свести к минимуму запросы к базе данных и наилучшим образом использовать данные, передаваемые в каждом запросе?