将 Spring Batch MyISAM 序列表迁移到 InnoDB

2023-12-24

Spring Batch 使用一些序列表,在 MySQL 中使用 MyISAM 存储引擎。我面临的问题是,我使用的是 Amazon Web Services RDS 数据库,并且它们的“时间点”数据库恢复功能不能很好地与包含 MyISAM 表的数据库配合使用。

我正在寻找一种解决方案,让我可以切换这些 Spring Batch MyISAM 序列表,并将其替换为 InnoDB 表,目的是启用 AWS RDS“时间点”数据库恢复功能。

Edit:

根据 @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 正常运行?


我确认,仅将 MyISAM 序列表更改为 InnoDB 会导致在序列表上创建更新锁update...set...=last_insert_id()语句但在事务提交之前。使用 MyISAM 序列时不会创建这些锁。因此,“简单”的方法可能会对性能产生负面影响。

这就是我的想法。不确定这是最简单的方法,但它确实有效。

  1. Per this https://stackoverflow.com/a/12327525/1325237答案是,删除现有的序列表并用单列重新定义它们uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
  2. 创建一个存储过程:a) 将序列名称作为参数,b) 插入到序列中,c) 返回 LAST_INSERT_ID()
  3. 编写一个扩展的java类MySQLMaxValueIncrementer并调用存储过程getNextKey()方法。我正在使用一个SimpleJdbcCall实例来执行此操作。
  4. 编写一个java类来实现DataFieldMaxValueIncrementerFactory并从步骤 #3 返回一个实例getIncrementer() method
  5. 在批量配置中,更新org.springframework.batch.core.repository.support.JobRepositoryFactoryBean配置以使用步骤 #4 中的增量器工厂
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Spring Batch MyISAM 序列表迁移到 InnoDB 的相关文章

随机推荐