CannotCreateTransactionException в пакетном процессе JPA Spring Data - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь обработать около 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]

Есть несколько похожих вопросов на этом сайте, и у меня естьпопробовал некоторые из них:

  1. повторить попытку 5 раз после MyRepository.saveAll() исключения исключения

  2. использовать 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);
    

По-прежнему не работает.Как я могу это исправить?

1 Ответ

0 голосов
/ 28 февраля 2019

Я много искал и пробовал разные решения.

Наконец, после изменения моей конфигурации на это исключение больше не отображается:

@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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...