【发布时间】: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]
这个网站上有一些类似的问题,我已经尝试了其中的一些:
MyRepository.saveAll()抛出异常后重试 5 次-
将
BasicDataSource与更大的maxActive和setValidationQuery、setTestOnBorrow一起使用: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