Я делаю пакетную вставку следующим образом:
Код: Выделить всё
public List insertBatch(final List
pageEnterLeaveObjects) {
final String stmt = "insert into mwfs2_page_enter_leave (session_id, form_id, version, tenant, page, enter_ts, leave_ts)" +
" values (:sessionId, :formId, :version, :tenant, :page, :enter, :leave)";
final List result = new LinkedList();
ListUtils.partition(pageEnterLeaveObjects, 10000)
.forEach(partition -> {
final SqlParameterSource[] sqlParameterSources = partition.stream()
.map(pageEnterLeave ->
new MapSqlParameterSource()
.addValue("sessionId", pageEnterLeave.getSessionId())
.addValue("formId", pageEnterLeave.getFormId())
.addValue("version", pageEnterLeave.getVersion())
.addValue("tenant", Optional.ofNullable(pageEnterLeave.getTenant()).orElse(Constants.DEFAULT_TENANT))
.addValue("page", pageEnterLeave.getPage())
.addValue("enter", pageEnterLeave.getEnterTimestamp())
.addValue("leave", pageEnterLeave.getLeaveTimestamp()))
.toArray(SqlParameterSource[]::new);
final long exectime = StopWatch.run(() -> {
final int[] ints = namedParameterJdbcTemplate.batchUpdate(stmt, sqlParameterSources);
result.addAll(Arrays.stream(ints).boxed().toList());
});
LOGGER.debug("insert {} datasets in {}ms", partition.size(), exectime);
});
return result;
}
Вот таблица:
Код: Выделить всё
create table dbo.mwfs2_page_enter_leave
(
session_id varchar(100) not null,
form_id varchar(100) not null,
version varchar(100) not null,
tenant varchar(100) not null,
page int not null,
enter_ts bigint not null,
leave_ts bigint,
diff bigint,
primary key (session_id, form_id, version, tenant, page, enter_ts)
)
Вот моя конфигурация Docker Compose:
Код: Выделить всё
mssql-2022:
image: 'mcr.microsoft.com/mssql/server:2022-latest'
restart: 'no'
environment:
ACCEPT_EULA: 'Y'
MSSQL_SA_PASSWORD: '******'
ports:
- '127.0.0.1:1433:1433'
Подробнее здесь: https://stackoverflow.com/questions/791 ... erformance
Мобильная версия