配置 JobRepository

如前所述,JobRepository 用于各种持久化 Spring Batch 中的域对象,例如 和 。 许多主要框架功能(如 、 和 )都需要它。JobExecutionStepExecutionJobLauncherJobStepspring-doc.cn

使用 时,将为您提供 a。 本节介绍如何对其进行自定义。作业的配置选项 repository 可以通过 Comments 的属性指定,如以下示例所示:@EnableBatchProcessingJobRepository@EnableBatchProcessingspring-doc.cn

Java 配置
@Configuration
@EnableBatchProcessing(
		dataSourceRef = "batchDataSource",
		transactionManagerRef = "batchTransactionManager",
		tablePrefix = "BATCH_",
		maxVarCharLength = 1000,
		isolationLevelForCreate = "SERIALIZABLE")
public class MyJobConfiguration {

   // job definition

}

此处列出的任何配置选项都不是必需的。 如果未设置,则使用前面显示的默认值。 最大长度默认为 ,即 示例架构脚本中长列的长度varchar2500VARCHARspring-doc.cn

batch 命名空间抽象出 implementations 及其协作者的许多实现细节。但是,仍然有一些 可用的配置选项,如下例所示:JobRepositoryspring-doc.cn

XML 配置
<job-repository id="jobRepository"
    data-source="dataSource"
    transaction-manager="transactionManager"
    isolation-level-for-create="SERIALIZABLE"
    table-prefix="BATCH_"
	max-varchar-length="1000"/>

除 之外,前面列出的任何配置选项都不是必需的。如果他们是 未设置,则使用前面显示的默认值。 默认为 ,这是示例模式脚本中长列的长度 。idmax-varchar-length2500VARCHARspring-doc.cn

JobRepository 的事务配置

如果使用 namespace 或 provided ,则事务性建议为 围绕存储库自动创建。这是为了确保批处理元数据 包括失败后重新启动所需的状态将正确保留。 如果存储库方法不是 事务。指定 method 属性中的隔离级别 以确保在启动作业时,如果两个进程尝试启动 同一时间执行相同的作业,只有一个成功。该 方法是 ,这是相当激进的。 通常效果相同 井。 如果两个进程在此中不太可能发生冲突,则很好 道路。但是,由于对该方法的调用非常短,因此只要数据库平台支持它,就不太可能导致问题。但是,您 可以覆盖此设置。FactoryBeancreate*SERIALIZABLEREAD_COMMITTEDREAD_UNCOMMITTEDcreate*SERIALIZEDspring-doc.cn

以下示例演示如何在 Java 中覆盖隔离级别:spring-doc.cn

Java 配置
@Configuration
@EnableBatchProcessing(isolationLevelForCreate = "ISOLATION_REPEATABLE_READ")
public class MyJobConfiguration {

   // job definition

}

以下示例演示如何在 XML 中覆盖隔离级别:spring-doc.cn

XML 配置
<job-repository id="jobRepository"
                isolation-level-for-create="REPEATABLE_READ" />

如果未使用命名空间,则还必须配置 使用 AOP 的存储库的事务行为。spring-doc.cn

以下示例显示如何配置存储库的事务行为 在 Java 中:spring-doc.cn

Java 配置
@Bean
public TransactionProxyFactoryBean baseProxy() {
	TransactionProxyFactoryBean transactionProxyFactoryBean = new TransactionProxyFactoryBean();
	Properties transactionAttributes = new Properties();
	transactionAttributes.setProperty("*", "PROPAGATION_REQUIRED");
	transactionProxyFactoryBean.setTransactionAttributes(transactionAttributes);
	transactionProxyFactoryBean.setTarget(jobRepository());
	transactionProxyFactoryBean.setTransactionManager(transactionManager());
	return transactionProxyFactoryBean;
}

以下示例显示如何配置存储库的事务行为 在 XML 中:spring-doc.cn

XML 配置
<aop:config>
    <aop:advisor
           pointcut="execution(* org.springframework.batch.core..*Repository+.*(..))"/>
    <advice-ref="txAdvice" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

您可以几乎按原样使用前面的 fragment,几乎不需要任何更改。还要记住 包含适当的名称空间声明,并确保 and(或整个 Spring)在 Classpath 上。spring-txspring-aopspring-doc.cn

更改表前缀

的另一个可修改属性是元数据的表前缀 表。默认情况下,它们都以 . 和 是两个例子。但是,有一些潜在的原因需要修改它 前缀。如果需要在表名前面加上架构名称,或者如果有多个 的元数据表集,则表前缀需要 被更改。JobRepositoryBATCH_BATCH_JOB_EXECUTIONBATCH_STEP_EXECUTIONspring-doc.cn

以下示例演示如何在 Java 中更改表前缀:spring-doc.cn

Java 配置
@Configuration
@EnableBatchProcessing(tablePrefix = "SYSTEM.TEST_")
public class MyJobConfiguration {

   // job definition

}

以下示例演示如何更改 XML 中的表前缀:spring-doc.cn

XML 配置
<job-repository id="jobRepository"
                table-prefix="SYSTEM.TEST_" />

鉴于上述更改,对元数据表的每个查询都以 为前缀。 称为 。SYSTEM.TEST_BATCH_JOB_EXECUTIONSYSTEM.TEST_JOB_EXECUTIONspring-doc.cn

只有表前缀是可配置的。table 和 column name 不是。

存储库中的非标准数据库类型

如果您使用的数据库平台不在受支持平台列表中,则 如果 SQL 变体足够接近,则可能能够使用支持的类型之一。待办事项 这样,您可以使用 RAW 而不是命名空间快捷方式和 使用它来将 Database type (数据库类型) 设置为最接近的匹配项。JobRepositoryFactoryBeanspring-doc.cn

以下示例演示如何使用 设置数据库类型 到 Java 中最接近的匹配项:JobRepositoryFactoryBeanspring-doc.cn

Java 配置
@Bean
public JobRepository jobRepository() throws Exception {
    JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
    factory.setDataSource(dataSource);
    factory.setDatabaseType("db2");
    factory.setTransactionManager(transactionManager);
    return factory.getObject();
}

以下示例演示如何使用 设置数据库类型 到 XML 中最接近的匹配项:JobRepositoryFactoryBeanspring-doc.cn

XML 配置
<bean id="jobRepository" class="org...JobRepositoryFactoryBean">
    <property name="databaseType" value="db2"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

如果未指定数据库类型,则尝试 从 中自动检测数据库类型。 平台之间的主要区别是 主要由递增主键的策略负责,因此 通常还需要覆盖 (通过使用标准的 来自 Spring Framework 的实现)。JobRepositoryFactoryBeanDataSourceincrementerFactoryspring-doc.cn

如果这不起作用,或者您没有使用 RDBMS,则 唯一的选项可能是实现 on 上,并以正常的 Spring 方式手动连接一个。DaoSimpleJobRepositoryspring-doc.cn