gpt4 book ai didi

具有 Multi-Tenancy 的 Spring Batch

转载 作者:行者123 更新时间:2023-12-04 21:37:38 26 4
gpt4 key购买 nike

我们如何定义针对多个租户运行的 Spring Batch 作业?

我已设置为每晚针对一个数据库模式按顺序运行一系列作业。当前所有作业都从一个位置读取文件并插入到数据库中。批处理配置非常基本,我定义了一个数据源、事务管理器并将作业存储库映射到它。我的工作将指向这个存储库和事务管理器。此外,我目前正在数据库中保存批处理元数据信息。

我的新要求是能够针对多个租户运行相同的作业(按顺序执行)。每个租户的数据可以存在于相同的数据库服务器中,但可以存在于不同的模式甚至不同的数据库服务器中。我的问题是

1) 我们是将所有租户的批处理特定元数据信息存储在一个公共(public)数据库中,还是每个租户数据库都应该有自己的数据库?

2) 我的理解是每个租户都需要一个数据源,这样特定于该租户的作业就可以访问数据库来存储从文件中读取的数据。在为该租户执行作业时,spring batch 存储库是否也应指向当前数据源?

3) 我们计划并行启动所有租户 [作业],这意味着 JOB1 可以同时为所有租户运行。目前我仍然不确定当这些租户运行时如何管理作业存储库、数据源、事务管理,每个租户都关联到不同的数据源。

4) 在我的脑海中,我所想的是为每个租户复制我现有的配置,并使用自己的作业存储库指向租户特定的数据源和事务管理器。如果没有其他方法可以在不复制的情况下动态定义相同内容,那么这是我最后要实现的事情。

如果任何机构已经解决或对如何接近解决方案有任何想法,请分享。示例配置应该有所帮助。

最佳答案

我参与了一个 SaaS 应用程序的构建,您需要在其中执行类似但不完全使用 Spring Batch 的操作。

你的主要想法是:

一个。定义一个主数据库,您将在其中存储所有特定于配置的数据假设您有一个映射您的租户名称、信息和数据源配置的表。

启动您的应用程序并读取此数据源并在您的服务器端维护一个本地缓存,其中键作为您的租户名称,值作为租户信息(数据源等)

在本地维护一个线程,例如:

public class TenantThreadLocalContext
{
public static final ThreadLocal<TenantInformation> threadLocal = new ThreadLocal<TenantInformation>();

public static void set(TenantInformation tenantInformation)
{
threadLocal.set(tenantInformation);
}

public static void unset()
{
threadLocal.remove();
}

public static TenantInformation get()
{
return threadLocal.get();
}

}

每当您启动任何线程以开始您的处理(批处理)时,将此线程设置为具有租户信息的本地线程,以便每个线程都知道它与哪个租户相关联。

最后在数据库处理的时候,你可以看到线程有什么数据源,你可以使用这个数据源来建立连接。

如果您正在使用 Hibernate,那么您很幸运,因为 Hibernate 4 已经为您完成了所有这些工作。引用:this .如果您在休眠配置等方面需要帮助,那么我可能也可以帮助您。

关于具有 Multi-Tenancy 的 Spring Batch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25516951/

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