Ich habe bestätigt, dass das bloße Ändern der MyISAM-Sequenztabellen in InnoDB dazu führt, dass nach dem update...set...=last_insert_id()
Aktualisierungssperren für die Sequenztabellen erstellt werden Anweisung, aber bevor die Transaktion festgeschrieben wurde. Diese Sperren werden nicht erstellt, wenn die MyISAM-Sequenzen verwendet werden. Der "einfache" Ansatz könnte sich also negativ auf die Leistung auswirken.
Hier ist, was ich mir ausgedacht habe. Nicht sicher, ob dies der einfachste Weg ist, aber es funktioniert.
- Gemäß dies
Antwort, löschen Sie die vorhandenen Sequenztabellen und definieren Sie sie mit einer einzigen Spalte
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
neu - Erstellen Sie eine gespeicherte Prozedur, die:a) den Sequenznamen als Argument nimmt, b) die Einfügung in die Sequenz vornimmt und c) LAST_INSERT_ID() zurückgibt.
- Schreiben Sie eine Java-Klasse, die
MySQLMaxValueIncrementer
erweitert und ruft die gespeicherte Prozedur ingetNextKey()
auf Methode. Ich verwende einenSimpleJdbcCall
Beispiel dafür. - Schreiben Sie eine Java-Klasse, die
DataFieldMaxValueIncrementerFactory
implementiert und gibt eine Instanz aus Schritt #3 vongetIncrementer()
zurück Methode - Aktualisieren Sie in der Stapelkonfiguration die
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
Konfiguration, um die Incrementer-Factory aus Schritt #4 zu verwenden