Как я могу настроить Alpakka Slick для включения потоковой передачи из моей базы данных на Java?

#java #post&resql #slick #akka-stream #alpakka

#java #post&resql #slick #akka-stream #alpakka

Вопрос:

Я пытаюсь передавать результаты запроса с использованием Slick в Java-приложении, используя Akka Streams и Post&res:

 Source mySource = Slick.source(
  slickSession,
  "SELECT * from messa&e where started_instant is null",
  (this::createQueueItemFromSlickRow));
  

В документации Slick ясно, что для потоковой передачи с Post&res необходимо установить дополнительные параметры. Однако я могу найти только примеры Scala, а в документации Alpakka нет информации о том, как это настроить.

Как бы то ни было, я не могу обрабатывать какие-либо новые объекты, которые поступают в базу данных после запуска потока.

Ответ №1:

Как вы заявили, в документации Slick отмечается следующее:

Примечание: Некоторые системы баз данных могут требовать, чтобы параметры сеанса были установлены определенным образом для поддержки потоковой передачи без одновременного кэширования всех данных в памяти на стороне клиента. Например, Post&reSQL требует как .withStatementParameters(rsType = ResultSetType.ForwardOnly, rsConcurrency = ResultSetConcurrency.ReadOnly, fetchSize = n) (с желаемым размером страницы n ), так и .transactionally для правильной потоковой передачи.

1 PreparedStatement Служба поддержки Alpakka Slick недавно представила в своем Java DSL, который вы можете использовать для установки вышеупомянутых параметров, если вы не можете использовать Scala API. Например:

 PreparedStatement statement =
  connection.prepareStatement(
    "MY SQL STATEMENT",
    ResultSet.TYPE_FORWARD_ONLY, // java.sql.ResultSet
    ResultSet.CONCUR_READ_ONLY);
  

Ознакомьтесь с SlickTest.java классом и приведенным выше запросом на извлечение для получения более подробной информации.

1Это изменение является частью предстоящего выпуска Alpakka 2.0.2. (Версия 2.0.1 является текущим выпуском на момент написания этой статьи.)