Изменение MySql db во время выполнения запроса Streaming

Я пытаюсь использовать функцию "Потоковый запрос" весенних данных, но у меня проблемы с выполнением обновлений одновременно с потоковой передачей.

Это ошибка, которую я получаю:

SQL Error: 0, SQLState: S1000
Streaming result set com.mysql.cj.protocol.a.result.ResultsetRowsStreaming@483b7dc4 is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.

У меня два репозитория - один для чтения, а другой для записи данных.

@Repository
public interface ArticleRepository extends JpaRepository<Article, Integer> {
    @QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE))
    @Query("select a from Article a")
    Stream<Article> streamAll();
}

public interface WordRepository extends JpaRepository<Word, Integer> {}

Проблема заключается в том, что MYSQL не позволяет использовать одно и то же соединение для записи в БД, когда Streaming ResultSet открыт для чтения. Если я использую новое соединение для записи при открытом Streaming ResultSet, все работает нормально:

String cs = "jdbc:mysql:...";
        try(Connection c = DriverManager.getConnection(cs, "root", "123456");
            Statement st1 = c.createStatement();) {
            int res = st1.executeUpdate("INSERT INTO words (word) VALUES ('asd')");
        }

Теперь вопрос - как заставить WordRepository всегда использовать новое соединение, а не повторно использовать то же, что используется ArticleRepository? Я не хотел бы говорить об этом напрямую с JDBC, но использую те же высокоуровневые функциональные возможности JPA, которые уже существуют. Я использую весенние ботинки и Hikari.

ОБНОВИТЬ

После некоторого тестирования я обнаружил, что он также работает, если я вручную введу новый EntityManager в другое репо следующим образом:

public class WordRepositoryCstmImpl implements WordRepositoryCstm {
  private final EntityManager entityManager;

  WordRepositoryCstmImpl(EntityManagerFactory entityManagerFactory) {
      this.entityManager = entityManagerFactory.createEntityManager();
  }
...

Проблема здесь в том, что мне нужно реализовать все методы, которые автоматически генерируются данными Spring (например, save должен использовать this.entityManager.merge и т. д.)

Итак, переосмысленный вопрос - как внедрить новый Entity Manager в public interface WordRepository?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
470
1

Ответы 1

Вы пытались создать настраиваемый интерфейс, расширяющий JPARepository, и создать реализацию, в которой вы устанавливаете новый источник данных (в вашем случае, возможно, новое соединение) для EntityManager. Примерно так: https://www.javabullets.com/access-entitymanager-spring-data-jpa/

Также см. Этот вопрос: Spring Boot, Spring Data JPA с несколькими источниками данных

Да, я обновил вопрос этими новыми выводами - если я реализую новое репо, я могу получить новый EntityManager, и он будет работать, но проблема в том, что мне нужно создать весь метод вручную (даже метод сохранения должен быть создан вручную в java) .

Bojan Vukasovic 29.06.2018 16:10

Другие вопросы по теме