【问题标题】:CannotCreateTransactionException in Spring Data JPA batch processSpring Data JPA批处理中的CannotCreateTransactionException
【发布时间】:2019-02-28 04:54:23
【问题描述】:

我正在尝试处理大约 1000 万条 MySQL DB1 记录,然后将它们保存到 MySQL DB2

我使用大约 50 个线程来实现这一点。生产者从中获取500 记录 MySQL DB1 一次,然后将它们放入队列中。大约 50 个消费者会处理它们,然后插入到MySQL DB2

在大多数情况下,它工作正常。但是对于大约 5 万条记录,它会失败。

我分析日志后发现CannotCreateTransactionException被抛出:

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.TransactionException: JDBC begin transaction failed:
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:450) ~[spring-orm-5.0.9.RELEASE.jar!/:5.0.9.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378) ~[spring-tx-5.0.9.RELEASE.jar!/:5.0.9.RELEASE]

这个网站上有一些类似的问题,我已经尝试了其中的一些:

  1. MyRepository.saveAll() 抛出异常后重试 5 次

  2. BasicDataSource与更大的maxActivesetValidationQuerysetTestOnBorrow一起使用:

    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setMaxActive(100);
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("***");
    dataSource.setUsername("***");
    dataSource.setPassword("***");
    dataSource.setTestOnBorrow(true);
    dataSource.setValidationQuery("SELECT 1");
    dataSource.setMaxActive(30);
    

还是不行。我该如何解决这个问题?

【问题讨论】:

    标签: java mysql spring multithreading hibernate


    【解决方案1】:

    我搜索了很多并尝试了不同的解决方案。

    最后,将我的配置更改为这个后,异常不再显示:

    @Bean
    public DataSource poiDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setMaxActive(100);
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("**");
        dataSource.setUsername("**");
        dataSource.setPassword("**");
        dataSource.setTestOnBorrow(true);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setMaxActive(30);
        dataSource.setRemoveAbandoned(true);
        dataSource.setMaxWait(60000);
        dataSource.setTimeBetweenEvictionRunsMillis(300000);
        dataSource.setMinEvictableIdleTimeMillis(300000);
        dataSource.setTestWhileIdle(true);
        dataSource.setLogAbandoned(true);
        return dataSource;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 2019-09-08
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多