升级Liquibase至4.31.0后自动生成快照导致变更执行变慢的原因及禁用方法咨询
升级Liquibase至4.31.0后自动生成快照导致变更执行变慢的原因及禁用方法咨询
问题原因
Liquibase在4.27.0版本引入了变更总结(Update Summary)功能:当你设置liquibase.setShowSummaryOutput(UpdateSummaryOutputEnum.LOG)时,为了生成详细的变更执行日志总结,Liquibase会默认在每个changeset执行完成后自动创建数据库快照——这个快照用于对比变更前后的数据库状态,从而输出对象创建/修改/删除的详细信息。
在4.26.0及更早版本中,该特性要么不存在,要么默认未开启,因此你之前不会看到每个changeset对应的快照生成日志。
解决方法
根据你的需求,有两种方案可以禁用这种逐变更的快照生成行为:
方案1:完全关闭变更总结输出
如果你不需要变更执行的总结日志,直接将UpdateSummaryOutputEnum.LOG改为UpdateSummaryOutputEnum.OFF即可,Liquibase会立即停止触发每个changeset后的快照生成:
var resourceAccessor = new DirectoryResourceAccessor(pathToChangeLogFiles); try (var liquibase = new Liquibase(changeLogFile, resourceAccessor, databaseConnection)) { Scope.enter(Map.of(Scope.Attr.ui.name(), new LoggerUIService())); // 关闭变更总结输出,彻底禁用快照触发逻辑 liquibase.setShowSummaryOutput(UpdateSummaryOutputEnum.OFF); liquibase.update(contexts); }
方案2:保留变更总结但禁用逐变更快照
如果你仍需要变更总结日志,但希望减少快照开销,可以通过Scope属性强制关闭SNAPSHOT_PER_CHANGESET开关——这样Liquibase仅会在整个update操作完成后生成一次最终快照,而非每个changeset都生成:
var resourceAccessor = new DirectoryResourceAccessor(pathToChangeLogFiles); try (var liquibase = new Liquibase(changeLogFile, resourceAccessor, databaseConnection)) { // 在Scope中添加禁用单变更快照的配置 Scope.enter(Map.of( Scope.Attr.ui.name(), new LoggerUIService(), Scope.Attr.SNAPSHOT_PER_CHANGESET.name(), false )); liquibase.setShowSummaryOutput(UpdateSummaryOutputEnum.LOG); liquibase.update(contexts); }
验证效果
修改完成后重新执行变更,你会发现日志中不再出现每个changeset对应的[liquibase.snapshot] (main) INFO Creating snapshot条目,变更执行时间会回到4.26.0版本的水平。
备注:内容来源于stack exchange,提问作者Manuel K
相关产品推荐
相关产品推荐

