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

时间:2016-12-19 11:18:06

标签: java postgresql spring-boot spring-data datasource

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

我目前的代码是这样的

ressources

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);
    }
}

我想像这样改变

ressources

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上运行我的请求

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

谢谢:)

2 个答案:

答案 0 :(得分:0)

根据您的评论,您希望单个Repository实例在不同的schemata之间切换。

这不会奏效。

您可以做的是为多个Repository实例提供Facade,该实例根据某些参数/ field / property将每个调用委托给多个实例。

但是,无论如何,您必须为每个实例创建一个具有不同数据库连接的单独Repository实例。

答案 1 :(得分:0)

您所描述的内容称为使用多个数据库的多租户。 要做到这一点,您需要手动配置持久层,而不是完全依赖Spring Boot自动配置功能。<​​/ p>

持久层配置包括:

  • Hibernate,JPA和数据源属性
  • 数据源bean
  • 实体经理工厂bean(在Hibernate的情况下,具有指定此属性的属性是多租户实体管理器工厂bean和租户连接提供商以及租户解析器)
  • 事务管理器bean
  • Spring Data JPA和事务支持配置

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