Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Migrieren von Spring Batch MyISAM-Sequenztabellen zu InnoDB

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.

  1. 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
  2. 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.
  3. Schreiben Sie eine Java-Klasse, die MySQLMaxValueIncrementer erweitert und ruft die gespeicherte Prozedur in getNextKey() auf Methode. Ich verwende einen SimpleJdbcCall Beispiel dafür.
  4. Schreiben Sie eine Java-Klasse, die DataFieldMaxValueIncrementerFactory implementiert und gibt eine Instanz aus Schritt #3 von getIncrementer() zurück Methode
  5. Aktualisieren Sie in der Stapelkonfiguration die org.springframework.batch.core.repository.support.JobRepositoryFactoryBean Konfiguration, um die Incrementer-Factory aus Schritt #4 zu verwenden