---
title: Spring Batch + Spring BootでJob内で利用するデータベースとJobを管理するデータベースを別々にするメモ
tags: ["Spring Batch", "Spring Boot", "Java", "Spring"]
categories: ["Programming", "Java", "org", "springframework", "batch"]
date: 2025-04-08T15:43:22Z
updated: 2025-04-08T15:46:00Z
---

Spring BatchでJob内で利用するデータベースとJobを管理するデータベースを別々にする方法は、[Spring Bootのドキュメント](https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.batch.specifying-a-data-source)に書かれているのですが、実装例がないのでメモしておきます。

Spring Boot 3.4, Spring Batch 5.2で動作確認しました。

次のようなConfigクラスを用意しておけば良いです。

```java
package com.example.batch;

import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.batch.BatchDataSource;
import org.springframework.boot.autoconfigure.batch.BatchTransactionManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "spring.batch.datasource.url")
public class DataSourceConfig {

	@Bean
	@ConfigurationProperties("spring.datasource")
	public DataSourceProperties defaultDataSourceProperties() {
		return new DataSourceProperties();
	}

	@Bean
	@ConfigurationProperties("spring.datasource.hikari")
	public HikariDataSource defaultDataSource(
			@Qualifier("defaultDataSourceProperties") DataSourceProperties properties) {
		HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
		dataSource.setPoolName("default-pool");
		return dataSource;
	}

	@Bean
	@ConfigurationProperties("spring.batch.datasource")
	public DataSourceProperties batchDataSourceProperties() {
		return new DataSourceProperties();
	}

	@BatchDataSource
	@Bean(defaultCandidate = false)
	@ConfigurationProperties("spring.batch.datasource.hikari")
	public HikariDataSource batchDataSource(@Qualifier("batchDataSourceProperties") DataSourceProperties properties) {
		HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
		dataSource.setPoolName("batch-pool");
		return dataSource;
	}

	@BatchTransactionManager
	@Bean(defaultCandidate = false)
	public PlatformTransactionManager batchTransactionManager(@BatchDataSource DataSource dataSource) {
		return new JdbcTransactionManager(dataSource);
	}

}
```

`@Bean(defaultCandidate = false)`をつけることによって`@Qualifier`(`@BatchDataSource`や`@BatchTransactionManager`を含む)で明示しない限り、インジェクションの対象となりません。
Spring BootのAuto Configurationでは、`JobRepository`、`JobExplorer`を作成する際に`@BatchDataSource`や`@BatchTransactionManager`アノテーションが付いたBean定義があればそちらを使うようになっています。

プロパティの設定例は次のとおりです。

```properties
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase
spring.datasource.username=myuser
spring.datasource.password=secret
spring.batch.datasource.driver-class-name=org.postgresql.Driver
spring.batch.datasource.url=jdbc:postgresql://localhost:15432/spring_batch
spring.batch.datasource.username=spring_batch
spring.batch.datasource.password=admin
```

`spring.datasource.*`にJob内で利用するデータベースを設定します。これは通常のデータベースの設定と同じプロパティを使うようにしました。
`spring.batch.datasource.*`にJobを管理するデータベースを設定します。
`@ConditionalOnProperty(name = "spring.batch.datasource.url")`がついているため、`spring.batch.datasource.url`でJobを管理するデータベースの設定を明示的に行った時のみ上記のConfigが有効になります。
`spring.batch.datasource.url`の指定がない場合はデフォルトのAuto Configurationのままです。 

この例では、Job内で利用するデータベースとJobを管理するデータベースの両方にPostgreSQLを使用していますが、別のデータベースでも構いません。
例えば、次のような定義にすれば、Jobを管理するデータベースにインメモリのH2データベースを利用できます。

```properties
spring.batch.datasource.url=jdbc:h2:mem:spring_batch
spring.batch.datasource.driverClassName=org.h2.Driver
spring.batch.datasource.username=sa
spring.batch.datasource.password=
```
