Многопоточный вызов 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 получается?