Mysql
 sql >> Base de données >  >> RDS >> Mysql

Migration des tables de séquence Spring Batch MyISAM vers InnoDB

J'ai confirmé que le simple fait de changer les tables de séquence MyISAM en InnoDB entraîne la création de verrous de mise à jour sur les tables de séquence après le update...set...=last_insert_id() déclaration mais avant que la transaction ait été validée. Ces verrous ne sont pas créés lors de l'utilisation des séquences MyISAM. L'approche "facile" pourrait donc avoir un impact négatif sur les performances.

Voici ce que j'ai trouvé. Je ne suis pas sûr que ce soit le moyen le plus simple, mais cela fonctionne.

  1. Par ceci répondez, supprimez les tables de séquence existantes et redéfinissez-les avec une seule colonne uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. Créer une procédure stockée qui :a) prend le nom de la séquence comme argument, b) effectue l'insertion dans la séquence, et c) renvoie LAST_INSERT_ID()
  3. Écrire une classe Java qui étend MySQLMaxValueIncrementer et appelle la procédure stockée dans le getNextKey() méthode. J'utilise un SimpleJdbcCall instance pour le faire.
  4. Écrire une classe Java qui implémente DataFieldMaxValueIncrementerFactory et renvoie une instance de l'étape 3 de getIncrementer() méthode
  5. Dans la configuration par lots, mettez à jour le org.springframework.batch.core.repository.support.JobRepositoryFactoryBean configuration pour utiliser la fabrique d'incrémenteurs à partir de l'étape 4