Spring 引导中的多租户
Multi tenancy in Spring Boot
我在创建 spring 引导应用程序时遇到问题,该应用程序可以根据用户输入动态连接到多个数据库。基本上,应用程序在不同的数据库上运行相同的 sql 查询。在 之后对我的尝试进行建模,我收到了以下错误:
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.
配置class:
@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
关于如何完成此任务的任何想法?如您所知,我对这种多数据库配置还不是很精通。
DataSourceBuilder.create().build()
将实例化 HikariDataSource
,因为它是 SpringBoot 2.0 的默认数据源。如果您查看 HikariDataSource 源代码,属性是 jdbcUrl、username NOT url、用户。因此,您需要更改 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 引导应用程序时遇到问题,该应用程序可以根据用户输入动态连接到多个数据库。基本上,应用程序在不同的数据库上运行相同的 sql 查询。在
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.
配置class:
@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
关于如何完成此任务的任何想法?如您所知,我对这种多数据库配置还不是很精通。
DataSourceBuilder.create().build()
将实例化 HikariDataSource
,因为它是 SpringBoot 2.0 的默认数据源。如果您查看 HikariDataSource 源代码,属性是 jdbcUrl、username NOT url、用户。因此,您需要更改 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/ 所述。