gpt4 book ai didi

spring-batch - Hibernate Multi-Tenancy 和 Spring Batch 集成

转载 作者:行者123 更新时间:2023-12-04 04:11:33 27 4
gpt4 key购买 nike

我们有一个 Web 应用程序,它使用 spring 事务管理和每个租户设置的 hibernate 多模式,租户根据请求 url 得到解析。我想根据 web 请求做一些特定于租户的 spring batch 作业,据我所知,提供给 spring batch 的数据源没有识别租户的能力,也没有能力将作业实例数据插入到相应的租户模式中。我想我们可以将租户 ID 添加到作业参数,并使其成为驻留在默认架构上的每个租户的唯一作业。但我的要求是将作业实例数据保存在特定于租户的模式中,并根据租户 ID 获取作业和运行作业。任何想法将不胜感激。

最佳答案

好吧,我有好消息和坏消息。好消息是这很容易做到。默认的 JobRepository(将作业元数据读/写到数据库中)是无状态的,因为如果您提供给它的 DataSource 是租户感知的,那么它会进入正确的架构。因此,您需要做的就是为 Spring Batch 提供一个返回上下文正确连接的数据源。例如,您确保数据源在返回连接之前为其设置了正确的模式。这是一个例子:

@Bean
@Scope(value='thread', proxyMode = ScopedProxyMode.INTERFACES)
DataSource dataSource() {
DataSource original = new JdbcDataSource(
url:'jdbc:h2:mem:temp_db;DB_CLOSE_DELAY=-1',
user: 'sa',
password: 'sa',)
new DataSource() {
@Delegate
DataSource delegate = original

@Override
Connection getConnection() throws SQLException {
String schema = schemaHolder().schema
original.connection.with {
it.createStatement().execute("SET SCHEMA $schema")
// in other databases, the syntax may be different, e.g.
//it.createStatement().execute("USE $schema")
it
}
}

@Override
Connection getConnection(String username, String password) throws SQLException {
connection
}
}
}

在此示例中(在 Groovy 中),当我从内存数据库中的 H2 返回连接时,我设置了正确的模式。查看full example .我使用 Spring thread 范围来告诉每个线程它应该使用哪个模式,但您可以使用任何您想要的方式来确定数据源中的正确模式。

现在,坏消息来了。如果您实际运行完整的示例,您可能会遇到这样的失败:

Caused by: org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=1 with wrong version (2), where current version is 1

原因是 Spring Batch 确实有一个令人讨厌的全局状态——静态变量 StepSynchronizationManager.manager 包含一个名为 contexts 的映射,它存储了所有步骤执行上下文当前处于事件状态。这是一个键为 StepExecution 的映射。 StepExecution::equals 的定义方式是,具有相同作业实例 ID、相同步骤名称和相同 ID 的两个实例比较相等。如果您碰巧同时运行两个具有相同(自动生成的)ID 的作业,每个作业运行两个具有相同(自动生成的)ID 和相同名称的步骤,您就会遇到麻烦。这在现实世界中不太可能发生,但您应该注意这一点。

关于spring-batch - Hibernate Multi-Tenancy 和 Spring Batch 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35529766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com