2015-01-15 2 views
2

Весенняя партия использует несколько таблиц последовательности, которые в случае использования MySQL используют механизм хранения MyISAM. Проблема, с которой я сталкиваюсь, заключается в том, что я использую базу данных RDS Amazon Web Services, а их функция восстановления базы данных «Point in Time» не очень хорошо работает с базами данных, содержащими таблицы MyISAM.Миграция весенних партий таблиц последовательности MyISAM в InnoDB

Я ищу решение, которое позволит мне отключить эти таблицы последовательности Spring Batch MyISAM и вместо этого заменить их таблицами InnoDB с целью включения функции восстановления базы данных AWS RDS «Point in Time».

Edit:

Per @ ответ Майкла, вот комментарий от класса MySQLMaxValueIncrementer Java, который считывает последовательность:

The sequence is kept in a table; there should be one sequence table per 
table that needs an auto-generated key. The table type of the sequence table 
should be MyISAM so the sequences are allocated without regard to any 
transactions that might be in progress. 

Так что мой конкретный вопрос: «Что является самым простым из возможных способов удалите таблицу последовательности MyISAM "и продолжайте напевать Spring Batch?

+0

Что таким ваш реальный вопрос? Вы можете изменить сценарии ... –

+0

Майкл, спасибо за проверку моего вопроса. Если это так же просто, как изменить определение таблицы, это здорово. Этот комментарий в MySQLMaxValueIncrementer заставил меня поверить, что это не так просто. «Последовательность хранится в таблице, должна быть одна таблица последовательностей для каждой таблицы, для которой нужен автоматически сгенерированный ключ. Тип таблицы таблицы последовательности должен быть MyISAM, поэтому последовательности распределяются независимо от любых транзакций, которые могут выполняться «. – Alex

ответ

1

Я подтвердил, что просто изменение таблиц последовательности MyISAM в InnoDB вызывает создание блокировок обновлений в таблицах последовательностей после инструкции update...set...=last_insert_id(), но до того, как транзакция была совершена. Эти блокировки не создаются при использовании последовательностей MyISAM. Таким образом, «простой» подход может оказать негативное влияние на производительность.

Вот что я придумал. Не уверен, что это самый простой способ, но он работает.

  1. Per this ответа, падение существующих таблиц последовательности и переопределить их с помощью одного столбца uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. Создать хранимую процедуру, которая: а) принимает имя последовательности в качестве аргумента, б) делает вставку в последовательность , и c) возвращает LAST_INSERT_ID()
  3. Напишите класс java, который расширяет MySQLMaxValueIncrementer и вызывает хранимую процедуру в методе getNextKey(). Для этого я использую экземпляр SimpleJdbcCall.
  4. Напишите класс Java, который реализует DataFieldMaxValueIncrementerFactory и возвращает экземпляр из шага # 3 из getIncrementer() метода
  5. В конфигурации периодического обновления конфигурации org.springframework.batch.core.repository.support.JobRepositoryFactoryBean использовать инкрементор завод с шагом # 4
Смежные вопросы