Jeg bekræftede, at blot ændring af MyISAM-sekvenstabellerne til InnoDB forårsager, at der oprettes opdateringslåse på sekvenstabellerne efter update...set...=last_insert_id() erklæring, men før transaktionen er begået. Disse låse oprettes ikke ved brug af MyISAM-sekvenserne. Så den "lette" tilgang kan have en negativ indvirkning på ydeevnen.
Her er hvad jeg fandt på. Ikke sikker på, at dette er den nemmeste måde, men det virker.
- Per dette
svar, slip de eksisterende sekvenstabeller og omdefiner dem med en enkelt kolonne
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment - Opret en lagret procedure, der:a) tager sekvensnavnet som et argument, b) laver indsættelsen i sekvensen, og c) returnerer LAST_INSERT_ID()
- Skriv en java-klasse, der udvider
MySQLMaxValueIncrementerog kalder den lagrede procedure igetNextKey()metode. Jeg bruger etSimpleJdbcCallinstans for at gøre dette. - Skriv en java-klasse, der implementerer
DataFieldMaxValueIncrementerFactoryog returnerer en instans fra trin #3 fragetIncrementer()metode - I batchkonfigurationen skal du opdatere
org.springframework.batch.core.repository.support.JobRepositoryFactoryBeankonfiguration til at bruge inkrementerfabrikken fra trin #4