Я пытаюсь обработать около 10 миллионов записей MySQL DB1
, а затем сохранить их в MySQL DB2
.
Я использую около 50 потоков для достижения этой цели.Производитель извлекает 500
записей из MySQL DB1
один раз, затем помещает их в очередь.Около 50 потребителей будут обрабатывать их, а затем вставлять в MySQL DB2
.
. В большинстве случаев работает нормально.Но для примерно 50 тысяч записей это не удается.
После анализа журнала я обнаружил, что было брошено 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]
Есть несколько похожих вопросов на этом сайте, и у меня естьпопробовал некоторые из них:
повторить попытку 5 раз после MyRepository.saveAll()
исключения исключения
использовать 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);
По-прежнему не работает.Как я могу это исправить?