Mysql
 sql >> Database >  >> RDS >> Mysql

Migrazione delle tabelle di sequenza MyISAM di Spring Batch su InnoDB

Ho confermato che la semplice modifica delle tabelle di sequenza MyISAM in InnoDB provoca la creazione di blocchi di aggiornamento sulle tabelle di sequenza dopo update...set...=last_insert_id() dichiarazione ma prima che la transazione sia stata confermata. Questi blocchi non vengono creati quando si utilizzano le sequenze MyISAM. Quindi l'approccio "facile" potrebbe avere un impatto negativo sulle prestazioni.

Ecco cosa mi è venuto in mente. Non sono sicuro che questo sia il modo più semplice, ma sta funzionando.

  1. Per questo rispondere, eliminare le tabelle di sequenza esistenti e ridefinirle con una singola colonna uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. Crea una procedura memorizzata che:a) prenda il nome della sequenza come argomento, b) esegua l'inserimento nella sequenza e c) restituisca LAST_INSERT_ID()
  3. Scrivi una classe java che estenda MySQLMaxValueIncrementer e chiama la procedura memorizzata in getNextKey() metodo. Sto usando un SimpleJdbcCall istanza per farlo.
  4. Scrivi una classe java che implementi DataFieldMaxValueIncrementerFactory e restituisce un'istanza dal passaggio n. 3 da getIncrementer() metodo
  5. Nella configurazione batch, aggiorna org.springframework.batch.core.repository.support.JobRepositoryFactoryBean configurazione per utilizzare la fabbrica dell'incrementatore dal passaggio n. 4