Spring-Batch JdbcCursorItemReader Тайм-аут соединения, когда размер пула равен 1JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Spring-Batch JdbcCursorItemReader Тайм-аут соединения, когда размер пула равен 1

Сообщение Anonymous »

При создании секционированного задания в Spring-Batch, которое использует JdbcCursorItemReader и пул соединений Hikari с MaximumPoolSize=1, на секционированном этапе всегда выдается исключение CannotCreateTransactionException: не удалось открыть соединение JDBC для транзакции в самом начале выполнения шага. Это также происходит, когда для GridSize установлено любое значение, превышающее максимальное значениеPoolSize.
Это в некоторой степени означает, что параллелизм ограничен максимальным количеством соединений, которые может выполнить ваш пул. предоставлять. Что я здесь делаю не так?
В приведенном ниже примере у меня есть MaximumPoolSize=1 иgridSize=2, и задание всегда завершается с ошибкой:

Код: Выделить всё

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:313) ~[spring-jdbc-6.1.6.jar:6.1.6]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:531) ~[spring-tx-6.1.6.jar:6.1.6]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:405) ~[spring-tx-6.1.6.jar:6.1.6]
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:617) ~[spring-tx-6.1.6.jar:6.1.6]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:386) ~[spring-tx-6.1.6.jar:6.1.6]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.1.6.jar:6.1.6]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.1.6.jar:6.1.6]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) ~[spring-aop-6.1.6.jar:6.1.6]
at jdk.proxy2/jdk.proxy2.$Proxy49.updateExecutionContext(Unknown Source) ~[na:na]
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:234) ~[spring-batch-core-5.1.1.jar:5.1.1]
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:229) ~[spring-batch-core-5.1.1.jar:5.1.1]
at org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler.lambda$createTask$0(TaskExecutorPartitionHandler.java:132) ~[spring-batch-core-5.1.1.jar:5.1.1]
Установка maxPoolSize=3 иgridSize=2 позволяет успешно завершить задание.
Вот моя конфигурация задания :

Код: Выделить всё

@Configuration
@SpringBootApplication
public class AppConfiguration {

public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(AppConfiguration.class, args);
SpringApplication.exit(ctx);
}

@Autowired
PlatformTransactionManager transactionManager;
@Autowired
JobRepository jobRepo;
@Autowired
DataSource dataSource;

@Bean
public Job frrMockJob() {
return new JobBuilder("jobName", jobRepo).start(partitionedStep()).build();
}

@Bean
Step partitionedStep() {
return new StepBuilder("partitionedStep", jobRepo).partitioner(workStep())
.partitioner("workerStep", new SimplePartitioner())
.gridSize(2)
.taskExecutor(taskExecutor())
.build();
}

@Bean
public Step workStep() {
return new StepBuilder("step1", jobRepo)
.chunk(2, transactionManager)
.reader(reader())
.writer(writer())
.build();
}

@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor t = new ThreadPoolTaskExecutor();
t.setCorePoolSize(10);
t.setMaxPoolSize(10);
return t;
}

@Bean
@StepScope
JdbcCursorItemReader reader() {
JdbcCursorItemReader reader = new JdbcCursorItemReader();
reader.setDataSource(dataSource);
reader.setSql("SELECT 1");
reader.setRowMapper((rs, i) -> rs.getString(1));
reader.setPreparedStatementSetter(ps -> {
});
return reader;
}

@Bean
@StepScope
ItemWriter writer() {
return new ItemWriter() {
@Override
public void write(Chunk

Подробнее здесь: [url]https://stackoverflow.com/questions/78674945/spring-batch-jdbccursoritemreader-connection-timeout-when-pool-size-is-1[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»