具有相似架构的 Spring Multi 数据源

Posted

技术标签:

【中文标题】具有相似架构的 Spring Multi 数据源【英文标题】:Spring Multi datasource with similar schema 【发布时间】:2017-05-04 10:28:41 【问题描述】:

我在 PostgreSQL 上有 4 个具有相似架构的数据库

我现在的代码是这样的

资源

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres

DAO

public interface AccountRepository extends JpaRepository<Account, Long>

配置

@Configuration
public class AccountServiceConfiguration 
    @Autowired
    private AccountRepository accountRepository;

    @Bean
    public AccountService accountService() 
        return new AccountService(accountRepository);
    

控制器

@RestController
@RequestMapping("/accounts")
public class AccountController 
    @Autowired
    private AccountService accountService;

    @RequestMapping(name = "/", method = RequestMethod.GET)
    public Page<Account> getAccounts(Integer page, Integer size) 
        return accountService.getAll(page, size);
    

服务

public class AccounttService 
    public AccounttService(AccountRepository accountRepository) 
        this.accountRepository = accountRepository;
    
    public Page<Account> getAll(Integer page, Integer size) 
        PageRequest pageRequest = new PageRequest(page, size);
        return accountRepository.findAll(pageRequest);
    

我想这样改变

资源

spring.db1.url=jdbc:postgresql://db1:5432/postgres
spring.db1.username=postgres1
spring.db1.password=postgres1

spring.db2.url=jdbc:postgresql://db2:5432/postgres
spring.db2.username=postgres2
spring.db2.password=postgres2

spring.db3.url=jdbc:postgresql://db3:5432/postgres
spring.db3.username=postgres3
spring.db3.password=postgres3

spring.db4.url=jdbc:postgresql://db4:5432/postgres
spring.db4.username=postgres4
spring.db4.password=postgres4

控制器

...
public Page<Account> getAccounts(Integer page, Integer size, string env) 
    return accountService.getAll(page, size, env);

...

服务

public class AccounttService 
    public AccounttService(Map<AccountRepository> mapAccountRepository) 
        this.mapAccountRepository = mapAccountRepository;
    
    public Page<Account> getAll(Integer page, Integer size, String env) 
        PageRequest pageRequest = new PageRequest(page, size);
        // search in specific env
    

如何加载 4 个数据源(可能在地图上)并按环境搜索! 如果我发送 env=db1 我想在 db1 上运行我的请求

如果您有其他解决方案,我接受它,但必须使用一个存储库和一个实体来搜索所有数据库。

谢谢你:)

【问题讨论】:

这会有所帮助.. github.com/spring-projects/spring-data-examples/tree/master/jpa/… 我试试这个例子,但我需要使用单一存储库(不是多个存储库和多个配置) 您的问题是什么?你想达到什么目标?如果你想改变你的资源,那就去做吧。但我怀疑,你真的想要那个。 我的问题是如何加载4个数据源(可能在地图上)并按环境搜索!如果我发送 env=db1 并在 db1 上运行我的请求 多租户方法可以解决这个问题吗? anakiou.blogspot.co.uk/2015/08/… 【参考方案1】:

您所描述的称为使用多个数据库的多租户。 为此,您需要手动配置持久层,而不是完全依赖 Spring Boot 自动配置功能。

持久层配置涉及:

Hibernate、JPA 和数据源属性 数据源 bean 实体管理器工厂 bean(在 Hibernate 的情况下,属性指定这是一个多租户实体管理器工厂 bean 和租户连接提供程序以及租户解析器) 事务管理器 bean Spring Data JPA 和事务支持配置

在我最近发表的一篇博文中:Multi-tenant applications using Spring Boot, JPA, Hibernate and Postgres 我通过详细的实现来介绍这个确切的问题。

【讨论】:

【参考方案2】:

根据您的 cmets,您希望单个存储库实例在不同模式之间切换。

这行不通。

您可以做的是为多个 Repository 实例提供一个 Facade,它根据某些参数/字段/属性将每个调用委托给多个实例中的一个。

但一种或另一种方式,您必须创建一个单独的 Repository 实例,并为每个实例使用不同的数据库连接。

【讨论】:

以上是关于具有相似架构的 Spring Multi 数据源的主要内容,如果未能解决你的问题,请参考以下文章

如何获取和比较pyspark中两个数据框中相似列的所有值的数据类型

实战,Spring Boot整合GraphQL实现动态字段接口!

实战,Spring Boot整合GraphQL实现动态字段接口!

Spring Boot JPA:将一个实体映射到具有相同列的多个(很多)表

Multi-Cloud Kubernetes 最佳实践

Python Pandas - 连接两个具有不同行数和列数的数据框