2015-01-15 119 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