Spring Data JPA批处理中的CannotCreateTransactionException

xingbin :

我正在尝试处理大约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);
    

它仍然不起作用。我怎样才能解决这个问题?

xingbin :

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

最后,将配置更改为此后,该异常不再显示:

@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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章