メタデータテーブルの必要性について⚓︎
本サンプルアプリケーションは、 Spring Batch のアーキテクチャを利用してバッチ処理を実現しています。 Spring Batch では、バッチの実行履歴や実行状態の保存といったジョブ管理のためにメタデータテーブルを既定しており、バッチアプリケーションを実行するためにはそれらを作成しておく必要があります。 作成されるメタデータテーブルについては、メタデータテーブルを作成するスキーマ をご覧ください。
クラウドサービスのリソースにバッチアプリケーションを配置する場合や、バッチアプリケーションのジョブ管理を他のジョブ管理ツールに任せる場合、 Spring Batch でジョブを管理する必要はありません。
しかし、その場合でも Spring Batch の仕様でジョブ管理用のメタデータテーブルがなければアプリケーション実行時にエラーが発生し、メタデータテーブルの作成が強要されます。 そのため、 Spring Batch を利用する上で作成が必須となるメタデータテーブルに対し、とりうる対応について説明します。
メタデータテーブルをインメモリデータベースに作成するよう設定する⚓︎
前述の通り、 Spring Batch を利用する上で、どのような場合でもメタデータテーブルの作成が必須です。 このメタデータテーブルを実テーブルとして作成すると、不要な機能のためのテーブル管理が要求されます。
この対応策として、メインのデータベースとは別にメタデータ管理用のデータベースを分けることが挙げられます。 また、メタデータ管理用に H2
のようなインメモリデータベースを指定することで、メタデータテーブルがアプリケーション実行時にのみ生成されるようになり、アプリケーションの終了と共に削除されます。 これにより、メタデータテーブルの管理を考慮することなくバッチ処理を実現できます。
メタデータ管理用のセカンダリデータベースを設定するためには、 @BatchDataSource
を利用します。
バッチアプリケーションを常時稼働させる際の注意点
@Scheduled
を利用するなどでアプリケーションを常時稼働させ続ける場合、バッチ処理の終了でアプリケーションが終了しません。 これにより、メタデータテーブルの削除が行われずインメモリデータべース内にデータが蓄積され続けることでメモリが消費され、 Out Of Memory Error が発生する可能性があります。 このような場合、以下に示すような対応が必要になります。
- ジョブ管理ツール上で適時バッチを定期的に実行するようスケジューリングすることで、バッチ処理の完了と共にアプリケーションが必ず終了するようにする
- バッチ処理の終了と共にメタデータテーブルの削除処理を行うよう変更する
- インメモリデータベースを利用せず、メタデータがメインのデータベースに蓄積されることを許容する(後述)
メタデータをメインのデータベースで管理する場合⚓︎
メインのデータベースにメタデータテーブルが作成されることを許容する場合、インメモリデータベースで管理する場合に発生していたメモリへの蓄積を考慮する必要はありません。
ただし、メタデータによって実データを保存する容量が圧迫されることは避けなければいけません。 日次や週次といったタイミングで、定期的に自動でメタデータテーブル内のデータが削除されるよう設定するとよいでしょう。