Spring Batch Meta Table Cleanup
- バッチ実行のメタデータを作成しないことは仕様上出来なそうです
- オンメモリDBにメタデータを保存することは出来るが放置するとOOMになる可能性があるのでメタデータはDBに保存
- メタデータを定期的にクリーンアップする
- ただし、`spring-batch` の現バージョンでは削除APIは用意されていないので生のSQLクエリを作成
参考
- [Spring Batchのメタデータ削除. なぜメタデータを削除するのか? | by Daneitian | Medium](https://medium.com/@daneitian/spring-batch%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E5%89%8A%E9%99%A4-2cb03e75a756)
- [Spring BatchのインメモリDBのデータを削除する方法 - 弥生開発者ブログ](https://tech-blog.yayoi-kk.co.jp/entry/2022/12/13/000000#%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E8%87%AA%E5%8B%95%E3%81%AB%E3%81%AF%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84)
バッチメタデータの定期クリーンアップについて調査致しました。
以上のような方針で実装しようと考えているのですが問題ありませんでしょうか。
メタテーブル作らない方法
個別にメタデータを作る作らないの設定はできなそうなので, 定期的に実行結果を消すようにする
- v5.0.0 で
JobRepository.delete()が追加されたらしいのでそれで実装spring-boot-starter-batchのdependenciesみたい- Upgrade to Spring Batch 5.0.0 · Issue #33148 · spring-projects/spring-boot · GitHub
v3.0.0でv5.0.0にしたらしい
Spring Batchのメタデータは、コア・テーブルのFOREIGN KEYにより相互関係(Meta-Data Schemaを参照)があるため、次の順番にメタデータのレコードを削除する。
batch_step_execution_context
DELETE FROM BATCH_STEP_EXECUTION_CONTEXT WHERE STEP_EXECUTION_ID IN (SELECT STEP_EXECUTION_ID FROM BATCH_STEP_EXECUTION WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID FROM BATCH_JOB_EXECUTION WHERE CREATE_TIME < ?))batch_step_execution
DELETE FROM BATCH_STEP_EXECUTION WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID FROM BATCH_JOB_EXECUTION WHERE CREATE_TIME < ?)batch_job_execution_context
DELETE FROM BATCH_JOB_EXECUTION_CONTEXT WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID FROM BATCH_JOB_EXECUTION WHERE CREATE_TIME < ?)batch_job_execution_params
DELETE FROM BATCH_JOB_EXECUTION_PARAMS WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID FROM BATCH_JOB_EXECUTION WHERE CREATE_TIME < ?)batch_job_execution
DELETE FROM BATCH_JOB_EXECUTION WHERE CREATE_TIME < ?batch_job_instance
DELETE FROM BATCH_JOB_INSTANCE WHERE JOB_INSTANCE_ID NOT IN (SELECT JOB_INSTANCE_ID FROM BATCH_JOB_EXECUTION)- Spring Batchを業務で使ってハマったこと - Qiita
- クリーンアップSQLが遅くなるらしいので PostgreSQL > 外部キー を無効化したらしい
ALTER TABLE BATCH_JOB_EXECUTION DISABLE TRIGGER ALL;
ALTER TABLE BATCH_JOB_INSTANCE DISABLE TRIGGER ALL;