Spring Boot中的多租户

时间:2018-04-10 22:29:21

标签: java spring spring-boot spring-jdbc

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

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

属性文件:

{{1}}

关于如何实现这一目标的任何想法?正如你所知道的那样,我还没有超级精明的数据库配置。

1 个答案:

答案 0 :(得分:1)

DataSourceBuilder.create().build()将实例化HikariDataSource,因为它是SpringBoot 2.0的默认数据源。如果您查看 HikariDataSource 源代码,则属性为 jdbcUrl 用户名网址用户。因此,您需要更改 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
...
...

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

相关问题