具有相似架构的 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实现动态字段接口!