Spring Boot 中的多租户

Posted

技术标签:

【中文标题】Spring Boot 中的多租户【英文标题】:Multi tenancy in Spring Boot 【发布时间】:2018-09-20 16:06:19 【问题描述】:

我在创建可以动态连接到多个数据库的 Spring Boot 应用程序时遇到问题,具体取决于用户输入。基本上,应用程序在不同的数据库上运行相同的 sql 查询。在this 之后建模我的尝试,我收到以下错误:

2018-04-10 16:18:50.678 ERROR 15716 --- [  restartedMain] com.zaxxer.hikari.HikariConfig           : HikariPool-1 - dataSource or dataSourceClassName or jdbcUrl is required.

--

Caused by: java.lang.IllegalArgumentException: dataSource or  dataSourceClassName or jdbcUrl is required.

配置类:

@Configuration
public class ReconDBConfig 


@ConfigurationProperties(prefix = "spring.datasource.foo")
@Bean
@Primary
public DataSource fooDataSource() 
    return DataSourceBuilder
            .create()
            .build();


@ConfigurationProperties(prefix = "spring.datasource.bar")
@Bean
public DataSource barDataSource() 
    return DataSourceBuilder
            .create()
            .build();


属性文件:

spring.datasource.foo.url        =     jdbc:postgresql://localhost:5432/fooDB
spring.datasource.foo.user       =  admin
spring.datasource.foo.password   =  admin
spring.datasource.foo.driver     =  org.postgresql.Driver
spring.datasource.foo.maxconn    =  5
spring.datasource.foo.expiry     =  180
spring.datasource.foo.cache      =  true
spring.datasource.foo.retry      =  3
spring.datasource.foo.retrydelay =  30

spring.datasource.bar.url        =     jdbc:postgresql://not_localhost:5432/fooDB
spring.datasource.bar.user       =  definitely_not_admin
spring.datasource.bar.password   =  definitely_not_admin
spring.datasource.bar.driver     =  org.postgresql.Driver
spring.datasource.bar.maxconn    =  5
spring.datasource.bar.expiry     =  180
spring.datasource.bar.cache      =  true
spring.datasource.bar.retry      =  3
spring.datasource.bar.retrydelay =  30

关于我如何做到这一点的任何想法?如您所知,我对这种多数据库配置还不是超级精通。

【问题讨论】:

这个错误是在每次尝试时出现还是在第一次连接成功后出现? 每次,我只尝试构建项目不到 10 次......但每一次...... 注释掉其中一个bean,看看你是否得到同样的错误。有两个,异常并没有告诉你是哪一个导致了问题 已经完成,同样的错误。我确定它与“需要 dataSource 或 dataSourceClassName 或 jdbcUrl”有关,但我不确定如何在中添加它 您是否尝试按照here 指出的那样进行配置? 【参考方案1】:

DataSourceBuilder.create().build() 将实例化HikariDataSource,因为它是 SpringBoot 2.0 的默认数据源。如果您查看 HikariDataSource 源代码,则属性是 jdbcUrlusername 而不是 urluser强>。因此,您需要更改 application.properties 文件中的属性键,如下所示:

spring.datasource.foo.jdbcUrl=jdbc:postgresql://localhost:5432/fooDB
spring.datasource.foo.username=admin
...
...
spring.datasource.bar.jdbcUrl=jdbc:postgresql://not_localhost:5432/fooDB
spring.datasource.bar.username=definitely_not_admin
...
...

为了根据某些请求参数使用不同的数据源,您可能必须使用 Spring 的 AbstractRoutingDataSource,如此处https://spring.io/blog/2007/01/23/dynamic-datasource-routing/ 所述。

【讨论】:

以上是关于Spring Boot 中的多租户的主要内容,如果未能解决你的问题,请参考以下文章

使用多租户时的 Spring Boot 范围问题

Spring Boot + Spring Data 多租户

多租户:Spring 与 Hibernate

Spring Boot - 多租户 - 优化 API 的响应时间

Elastic Search 中的多租户

Spring Boot Keycloak 多租户配置