在执行流查询时修改MySql数据库

时间:2018-06-29 11:32:39

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

我正在尝试使用spring数据的“ 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手动注入到另一个仓库中也是可以的,

public class WordRepositoryCstmImpl implements WordRepositoryCstm {
  private final EntityManager entityManager;

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

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

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

1 个答案:

答案 0 :(得分:0)

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

另外,请参见以下问题:Spring Boot, Spring Data JPA with multiple DataSources