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
MySQLMaxValueIncrementer
i wywołuje procedurę składowaną wgetNextKey()
metoda. UżywamSimpleJdbcCall
przykład, aby to zrobić. - Napisz klasę Java, która implementuje
DataFieldMaxValueIncrementerFactory
i zwraca instancję z kroku #3 zgetIncrementer()
metoda - W konfiguracji wsadowej zaktualizuj
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
konfiguracja do użycia fabryki inkrementatorów z kroku #4