程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了多租户:使用Spring Data JPA管理多个数据源大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决多租户:使用Spring Data JPA管理多个数据源?

开发过程中遇到多租户:使用Spring Data JPA管理多个数据源的问题如何解决?下面主要结合日常开发的经验,给出你关于多租户:使用Spring Data JPA管理多个数据源的解决方法建议,希望对你解决多租户:使用Spring Data JPA管理多个数据源有所启发或帮助;

为了使用Spring Boot实现多租户,我们可以将AbstractRoutIngDatasource用作所有“租户数据库 ”的基础 类。 __

它有一个抽象方法determineCurrentLookupKey我们必须重写。它告诉您当前必须使用AbstractRoutIngDatasource哪个租户数据源。因为它在多线程环境中工作,所以所选租户的信息应存储在ThreadLocal变量中。

AbstractRoutIngDatasource租户数据源的信息存储在其private中@H_159_7@map<Object, Object> targetDatasources。该映射的键是 (例如String类型)和值- 。要将租户数据源放入此地图,我们必须使用其setter setTargetDatasources

如果AbstractRoutIngDatasource没有必须使用method设置的“默认”数据源,则无法使setDefaultTargetDatasource(Object defaultTargetDatasourcE)

设置租户数据源和默认数据源后,我们必须调用方法afterPropertIEsSet()来告知AbstractRoutIngDatasource来更新其状态。

所以我们的“ MultiTenantManager”类可以像这样:

@Configuration
public class MultiTenantManager {

    private final ThreadLocal<String> currentTenant = new ThreadLocal<>();
    private final Map<Object, Object> tenantDatasources = new ConcurrentHashMap<>();
    private final DatasourcePropertIEs propertIEs;

    private AbstractRoutIngDatasource multiTenantDatasource;

    public MultiTenantManager(DatasourcePropertIEs propertIEs) {
        this.propertIEs = propertIEs;
    }

    @Bean
    public Datasource datasource() {
        multiTenantDatasource = new AbstractRoutIngDatasource() {
            @OverrIDe
            protected Object determineCurrentLookupKey() {
                return currentTenant.get();
            }
        };
        multiTenantDatasource.setTargetDatasources(tenantDatasources);
        multiTenantDatasource.setDefaultTargetDatasource(defaultDatasource());
        multiTenantDatasource.afterPropertIEsSet();
        return multiTenantDatasource;
    }

    public voID addTenant(String tenantID, String url, String username, String password) throws sqlException {

        Datasource datasource = DatasourceBuilder.create()
                .driverClassname(propertIEs.getDriverClassname())
                .url(url)
                .username(userName)
                .password(password)
                .build();

        // check that new connection is 'live'. If not - throw exception
        try(Connection c = datasource.getConnection()) {
            tenantDatasources.put(tenantID, datasourcE);
            multiTenantDatasource.afterPropertIEsSet();
        }
    }

    public voID setCurrentTenant(String tenantID) {
        currentTenant.set(tenantID);
    }

    private DriveRMANagerDatasource defaultDatasource() {
        DriveRMANagerDatasource defaultDatasource = new DriveRMANagerDatasource();
        defaultDatasource.setDriverClassname("org.h2.Driver");
        defaultDatasource.setUrl("jdbc:h2:mem:default");
        defaultDatasource.setUsername("default");
        defaultDatasource.setpassword("default");
        return defaultDatasource;
    }
}

简要说明:

  • 映射tenantDatasources它是我们放置到setTargetDatasources设置程序中的本地租户数据源存储;

  • DatasourcePropertIEs propertIEs用于从spring.datasource.driverClassname‘application.propertIEs’ 的租户数据库获取数据库驱动程序类名称(例如org.POSTGResql.Driver);

  • 方法addTenant用于将新的租户及其数据源添加到我们的本地租户数据源存储中。有了这种方法, afterPropertIEsSet() ;

  • 方法setCurrentTenant(String tenantID)用于“切换”到给定租户的数据源。例如,在处理使用数据库的请求时,我们可以在REST控制器中使用此方法。该请求应包含“ tenantID”,例如在X-TenantID标头中,我们可以检索并放入此方法;

  • defaultDatasource() 是使用内存中的H2数据库构建的,以避免在运行的sql Server上使用默认数据库。

注意: 将spring.jpa.hibernate.ddl- auto参数设置为,none以禁用Hibernate在数据库模式中进行更改。您必须事先创建租户数据库的架构。

此类的完整示例,您可以在我的 找到更多示例。

更新

该分支演示了一个使用专用数据库存储租户数据库属性而不是属性文件的示例(请参见下面的@marcoGustavo问题)。

解决方法

我需要创建一个可以管理多个数据源的服务。当首次运行应用程序时,这些数据源不一定存在,实际上,端点将创建新数据库,我希望能够切换到它们并创建数据。

例如,假设我有3个数据库,A,B和C,然后启动应用程序,使用创建D的端点,然后再使用D。

那可能吗?

我知道如何切换到其他数据源(如果存在),但是现在看不到任何解决方案可以使我的请求成为可能。你有什么主意吗?

谢谢

大佬总结

以上是大佬教程为你收集整理的多租户:使用Spring Data JPA管理多个数据源全部内容,希望文章能够帮你解决多租户:使用Spring Data JPA管理多个数据源所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。