java—在执行流查询时修改mysql数据库

qgzx9mmu  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(685)

我正在尝试使用spring数据“流查询”功能,但是在流的同时执行更新时遇到了问题。
这是我得到的错误:

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。如果在流式处理结果集打开时使用新连接进行写入,则一切正常:

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注入另一个回购中,它也可以工作,如下所示:

public class WordRepositoryCstmImpl implements WordRepositoryCstm {
  private final EntityManager entityManager;

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

这里的问题是我必须实现由spring数据自动生成的所有方法(例如。 save 必须使用 this.entityManager.merge 等等)
所以重新定义了一个问题-如何将新的实体管理器注入到 public interface WordRepository ?

qxgroojn

qxgroojn1#

您是否尝试创建一个扩展jparepository的自定义接口,并在其中为entitymanager设置一个新数据源(在您的示例中,可能是一个新连接)的实现。像这样:https://www.javabullets.com/access-entitymanager-spring-data-jpa/
另外,请参阅这个问题:spring boot,spring data jpa和多个数据源

相关问题