Я пытаюсь использовать функцию пружинных данных " Потоковый запрос ", но возникают проблемы с выполнением обновлений одновременно с потоковой передачей.
Это ошибка, которую я получаю:
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.
UPDATE
После некоторого тестирования я обнаружил, что это также работает, если я вручную добавляю новый EntityManager в другое хранилище, как это:
public class WordRepositoryCstmImpl implements WordRepositoryCstm {
private final EntityManager entityManager;
WordRepositoryCstmImpl(EntityManagerFactory entityManagerFactory) {
this.entityManager = entityManagerFactory.createEntityManager();
}
...
Проблема здесь в том, что мне нужно реализовать все методы, которые автоматически генерируются данными пружины (например, save
должен использовать this.entityManager.merge
и т. Д.)
Итак, переопределенный вопрос - как добавить новый Entity Manager в public interface WordRepository
?