Potwierdziłem, że sama zmiana tabel sekwencji MyISAM na InnoDB powoduje utworzenie blokad aktualizacji na tabelach sekwencji po update...set...=last_insert_id() oświadczenie, ale przed dokonaniem transakcji. Blokady te nie są tworzone podczas korzystania z sekwencji MyISAM. Tak więc „łatwe” podejście może mieć negatywny wpływ na wydajność.
Oto, co wymyśliłem. Nie jestem pewien, czy jest to najłatwiejszy sposób, ale działa.
- Na to
odpowiedz, usuń istniejące tabele sekwencji i przedefiniuj je za pomocą pojedynczej kolumny
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment - Utwórz procedurę składowaną, która:a) przyjmuje nazwę sekwencji jako argument, b) wstawia do sekwencji i c) zwraca LAST_INSERT_ID()
- Napisz klasę Java, która rozszerza
MySQLMaxValueIncrementeri wywołuje procedurę składowaną wgetNextKey()metoda. UżywamSimpleJdbcCallprzykład, aby to zrobić. - Napisz klasę Java, która implementuje
DataFieldMaxValueIncrementerFactoryi zwraca instancję z kroku #3 zgetIncrementer()metoda - W konfiguracji wsadowej zaktualizuj
org.springframework.batch.core.repository.support.JobRepositoryFactoryBeankonfiguracja do użycia fabryki inkrementatorów z kroku #4