将Spring Batch的MyISAM序列表迁移到InnoDB

3

Spring Batch使用几个序列表,在MySQL的情况下使用MyISAM存储引擎。我面临的问题是,我正在使用亚马逊网络服务(AWS)RDS数据库,他们的“时间点”数据库恢复功能与包含MyISAM表的数据库不兼容。

我正在寻找解决方案,让我可以将这些Spring Batch MyISAM序列表替换为InnoDB表,从而实现启用AWS RDS“时间点”数据库恢复功能。

编辑:

根据@Michael的回答,这里有一个从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序列表并保持Spring Batch运行?”


你的实际问题是什么?你可以更改这些脚本... - Michael Minella
Michael,感谢您查看我的问题。如果只是更改表定义就可以解决,那太好了。MySQLMaxValueIncrementer中的这条评论让我相信事情并不简单。“序列保存在一个表中;每个需要自动生成键的表应该有一个序列表。序列表的表类型应该是MyISAM,这样就可以分配序列而不考虑可能正在进行的任何事务。” - Alex
1个回答

2
我确认仅将MyISAM序列表更改为InnoDB会在update...set...=last_insert_id()语句之后但事务提交之前创建对序列表的更新锁。使用MyISAM序列时不会创建这些锁。因此,“简单”的方法可能会对性能产生负面影响。
以下是我想出来的方法,不确定这是否是最简单的方法,但它可以工作:
  1. 根据答案,删除现有的序列表并重新定义它们,只有一个列uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. 创建一个存储过程:a)以序列名称作为参数,b)插入序列,c)返回LAST_INSERT_ID()
  3. 编写一个扩展了MySQLMaxValueIncrementer的Java类,并在getNextKey()方法中调用存储过程。我正在使用SimpleJdbcCall实例来完成这项任务。
  4. 编写一个实现DataFieldMaxValueIncrementerFactory的Java类,并从getIncrementer()方法返回第3步的实例
  5. 在批处理配置中,将org.springframework.batch.core.repository.support.JobRepositoryFactoryBean配置更新为使用第4步的增量器工厂

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接