Код: Выделить всё
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor( r -> {
Thread thread = new Thread(r);
thread.setName(shard);
return thread;
});
executors.add(executor);
Service service = serviceFactory.create(shard);
executor.scheduleAtFixedRate(service::process, (long) (Math.random() * 1001), config.getFetchInterval(), TimeUnit.MILLISECONDS);
< /code>
Итак, они не могут попытаться выбрать одни и те же строки при запуске, даже при работе над одним и тем же осколом. Итак, буквально, каждая транзакции long , которые блокируют таблицу, разбивают функцию.
В функции есть несколько выборов.select * from TABLE_A where ... for update skip locked fetch first ? rows only
Код: Выделить всё
public void process() {
TenantContext.setCurrentTenant(SHARD_NAME);
log.info("Start function");
long startMillis = System.currentTimeMillis();
LocalDateTime fromDate = lastStartDateParam = lastStartDateParam != null ? lastStartDateParam : config.getStartDate();
LocalDateTime toDate = fromDate.plusDays(3);
transactionRunner.doInTransaction(() -> {
// business logic here
return null
});
log.info("Finish deferred message import in date range {} - {} by {} ms",
fromDate, toDate, System.currentTimeMillis() - startMillis);
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... sharded-db