2015-01-15 51 views
2

Spring批處理使用一些序列表,在MySQL中使用MyISAM存儲引擎。我面臨的問題是我正在使用Amazon Web Services RDS數據庫,並且它們的「時間點」數據庫恢復功能不能很好地與包含MyISAM表的數據庫一起使用。將彈簧批次MyISAM序列表遷移到InnoDB

我正在尋找一種解決方案,它可以讓我將這些Spring批次MyISAM序列表替換爲InnoDB表,並以啓用AWS RDS「時間點」數據庫恢復功能爲目標。

編輯:

每@邁克爾的迴應,這裏是從Java MySQLMaxValueIncrementer類讀取序列的註釋:

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序列表「並保持彈簧批量嗡嗡聲?

+0

什麼是你真正的問題?您可以更改腳本... – 2015-01-15 19:10:47

+0

Michael,感謝您檢查我的問題。如果它和更改表格定義一樣簡單,那很好。 MySQLMaxValueIncrementer中的這條評論讓我相信並不那麼簡單。 「該序列保存在一個表中;每個表應該有一個序列表需要一個自動生成的密鑰,序列表的表類型應該是MyISAM,因此序列的分配不考慮任何可能正在進行的事務「。 – Alex 2015-01-15 21:10:08

回答

1

我確認只是將MyISAM序列表更改爲InnoDB會導致在update...set...=last_insert_id()語句之後但在事務提交之前在序列表上創建更新鎖。使用MyISAM序列時不會創建這些鎖。所以「簡單」方法可能會對性能產生負面影響。

這是我想出來的。不確定這是最簡單的方法,但它工作。

  1. this答案,刪除現有的序列表和與單個列uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. 創建一個存儲過程,重新定義它們:1)取序列名作爲參數,b)當所述插入件插入所述序列,並且c)返回LAST_INSERT_ID()
  3. 編寫一個擴展了MySQLMaxValueIncrementer的java類並調用getNextKey()方法中的存儲過程。我正在使用SimpleJdbcCall實例來執行此操作。
  4. 編寫實現DataFieldMaxValueIncrementerFactory並從getIncrementer()方法
  5. 在批量配置返回從步驟#3中的實例的Java類,更新org.springframework.batch.core.repository.support.JobRepositoryFactoryBean配置以使用增量器工廠從步驟#4