【问题标题】:Modifying MySql db while Streaming query is being executed在执行流式查询时修改 MySql 数据库
【发布时间】:2018-12-08 14:14:38
【问题描述】:

我正在尝试使用 spring data "Streaming query" 功能,但在流式传输的同时执行更新时遇到问题。

这是我得到的错误:

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> {}

问题在于,当 Streaming ResultSet 打开以供读取时,MYSQL 不允许使用相同的连接来写入 DB。如果我在 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 功能。我正在使用 spring boot 和 Hikari。

更新

经过一些测试,我发现它也可以工作如果我手动将新的 EntityManager 注入另一个 repo,如下所示:

public class WordRepositoryCstmImpl implements WordRepositoryCstm {
  private final EntityManager entityManager;

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

这里的问题是我必须实现所有由spring数据自动生成的方法(例如save必须使用this.entityManager.merge等)

如此重新定义的问题——如何将新的实体管理器注入public interface WordRepository

【问题讨论】:

    标签: java mysql spring spring-data-jpa spring-data


    【解决方案1】:

    您是否尝试过创建一个扩展 JPARepository 的自定义接口并在其中为 EntityManager 设置一个新 DataSource(在您的情况下,可能是一个新连接)的实现。 像这样:https://www.javabullets.com/access-entitymanager-spring-data-jpa/

    另外,请参阅此问题:Spring Boot, Spring Data JPA with multiple DataSources

    【讨论】:

    • 是的,我用这个新发现更新了问题 - 如果我实施新的 repo,我可以获得新的 EntityManager 并且它可以工作,但问题是我必须手动创建所有方法(甚至保存方法必须在java中手动创建)。
    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多