Многопоточный вызов select sql с jdbcTemplate

БД Oracle.

возникла ситуация что нужно сделать select из БД. Ответ может содержать почти 1 млн строк. Использую hikari для коннекта

datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      leak-detection-threshold: 600000
      minimum-idle: 10
      idleTimeout: 600000
      maxLifetime: 2000000
      maximum-pool-size: 50
      pool-name: "rsPool"
      auto-commit: true
      connection-timeout: 600000
      allow-pool-suspension: true
      driver-class-name: oracle.jdbc.OracleDriver
      jdbcUrl: ${datasource.url}
      username: ${datasource.username}
      password: ${datasource.password}

класс подключения

@Configuration
@EnableTransactionManagement
public class JdbcConfig {
    @Bean(name = "defaultHikariConfig")
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public HikariConfig hikariConfig() {
        return new HikariConfig();
    }

    @Bean(name = "defaultDataSource")
    public DataSource defaultDataSource(@Qualifier("defaultHikariConfig") HikariConfig hikariConfig) {
        return new HikariDataSource(hikariConfig);
    }

    @Bean(name = "defaultJdbcTemplate")
    public JdbcTemplate jdbcTemplate(@Qualifier("defaultDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "defaultTransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("defaultDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "defaultNamedParameterJdbcTemplate")
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(
            @Qualifier("defaultJdbcTemplate") JdbcTemplate jdbcTemplate) {
        return new NamedParameterJdbcTemplate(jdbcTemplate);
    }

    @Bean
    public OperationsDao operationsDao(NamedParameterJdbcTemplate jdbcTemplate) {
        return new OperationsDao(jdbcTemplate);
    }

}

Я решил разбить один вызов на шаги. Стало отрабатывать чуть побыстрее. Но все равно долго. почти час...

private List<Operation> getDataInCycle(int limit) {
        List<Operation> operations = new ArrayList<>(limit + limit / 2);
        int BUFFER_SIZE = 10000;
        int steps = limit / BUFFER_SIZE; // примерно 100-110 шагов получается по 10000 выборок
        int min = 0;
        int max = 0;

        for (int i = 0; i <= steps; i++) {
            min = max;
            max = Math.min(min + BUFFER_SIZE, limit);

            String query = "select .... OFFSET_число_min_ROWS FETCH NEXT _число_max_ ROWS ONLY"; // получается select по 10000 строк.

            operations.addAll(jdbcTemplate.query(query, namedParameters, new MyMapper()));

            if (min + BUFFER_SIZE == limit) break;
            
        }
        
        return operations;
    }

не подскажите как это лучше организовать через многопоточность? в каждый поток передавать свой jdbcTemplate получается?


Ответы (0 шт):