sql >> Base de Datos >  >> RDS >> Mysql

Migración de tablas de secuencia Spring Batch MyISAM a InnoDB

Confirmé que simplemente cambiar las tablas de secuencias de MyISAM a InnoDB hace que se creen bloqueos de actualización en las tablas de secuencias después de update...set...=last_insert_id() pero antes de que se haya comprometido la transacción. Estos bloqueos no se crean cuando se usan las secuencias MyISAM. Por lo tanto, el enfoque "fácil" podría tener un impacto negativo en el rendimiento.

Esto es lo que se me ocurrió. No estoy seguro de que esta sea la forma más fácil, pero está funcionando.

  1. Por esto respuesta, elimine las tablas de secuencia existentes y redefínalas con una sola columna uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. Cree un procedimiento almacenado que:a) tome el nombre de la secuencia como argumento, b) realice la inserción en la secuencia y c) devuelva LAST_INSERT_ID()
  3. Escriba una clase Java que amplíe MySQLMaxValueIncrementer y llama al procedimiento almacenado en getNextKey() método. Estoy usando un SimpleJdbcCall instancia para hacer esto.
  4. Escriba una clase java que implemente DataFieldMaxValueIncrementerFactory y devuelve una instancia del paso n.º 3 de getIncrementer() método
  5. En la configuración por lotes, actualice org.springframework.batch.core.repository.support.JobRepositoryFactoryBean configuración para usar la fábrica de incrementadores del paso n.º 4