Spring 即时启动重置数据源
Spring boot reset datasource on the fly
当 spring 配置文件或自定义数据库 属性 中的数据库 属性 等数据库名称、密码或主机名发生更改时,我正在尝试在 Spring 引导中更新数据源] 文件。当 属性 更改时,应用程序必须通过侦听 属性.
的更改自行更新
我使用 Spring 执行器在数据库配置更改后 /restart bean。但用户必须明确提出 post 请求才能重新启动。必须通过监听更改和更新数据源来避免此步骤。
你能告诉我在 Spring 启动时执行此操作的最佳方法吗?
您可以使用 Spring 的动态数据源路由并检查它是否有帮助?这是一项非常古老的技术,如果符合您的目的,可能会派上用场。
但请注意 - 这是数据源路由,而不是新的数据源配置。
https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
在我的项目中我使用了 multitenancy 。基本上我在这样的属性中定义了几个数据源:
primary.datasource.url=jdbc:postgresql://localhost:5432/db_name?currentSchema=schema_name
primary.datasource.username=user
primary.datasource.password=password
primary.datasource.driverClassName=org.postgresql.Driver
primary.datasource.driver-class-name=org.postgresql.Driver
secondary.datasource.url=jdbc:postgresql://localhost:5432/other_db?currentSchema=schema
secondary.datasource.username=user
secondary.datasource.password=password
secondary.datasource.driverClassName=org.postgresql.Driver
secondary.datasource.driver-class-name=org.postgresql.Driver
default.datasource.url=jdbc:postgresql://localhost:5432/default_db?currentSchema=public
default.datasource.username=user
default.datasource.password=password
default.datasource.driverClassName=org.postgresql.Driver
default.datasource.driver-class-name=org.postgresql.Driver
然后在配置中class定义了多个数据源:
@Bean
@Primary
@ConfigurationProperties(prefix="primary.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="secondary.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="default.datasource")
public DataSource defaultDataSource(){
return DataSourceBuilder.create().build();
}
并根据 this and this 文章配置了多租户。
优点:
- 简单的租户切换,可以手动触发,甚至可以配置为在请求(过滤器)中的某些特定 header 上触发。
- 可以配置为在模式或数据库之间切换。
- 动态发生(您不必重新启动 bean)
缺点:
- 您必须在 属性 文件中定义所有可能的数据库。
- 您必须关闭架构验证,因为它会出错。
找到了一种动态更新数据源的方法,
我已将包含数据库属性的外部 spring 配置文件提供给应用程序,然后使用数据源 bean 的 @RefreshScope 刷新属性。
线程监视文件更改并调用执行器 refresh() 方法。
database.properties
dburl=jdbc://localhost:5432/dbname
dbusername=user1
dbpassword=userpwd
正在创建数据源,
@RefreshScope
public class DBPropRefresh {
@Value("${dburl}")
private String dbUrl;
@Value("${dbusername}")
private String dbUserName;
@Value("${dbpassword}")
private String dbPassword;
@Bean
@RefreshScope
public DataSource getDatasource() {
return new DatasourceBuilder().create().url(dbUrl).username(dbUserName).password(dbPassword);
}
}
正在为应用程序提供外部配置文件,
java -jar myapplication.jar --spring.config.location=database.properties
我创建了一个 Java 线程 class 来监视 database.properties 文件更改。已关注 https://dzone.com/articles/how-watch-file-system-changes
当有变化时,它会调用 refreshEndPoint.refresh().
在pom.xml,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.6.RELEASE</version>
</dependency>
当 spring 配置文件或自定义数据库 属性 中的数据库 属性 等数据库名称、密码或主机名发生更改时,我正在尝试在 Spring 引导中更新数据源] 文件。当 属性 更改时,应用程序必须通过侦听 属性.
的更改自行更新我使用 Spring 执行器在数据库配置更改后 /restart bean。但用户必须明确提出 post 请求才能重新启动。必须通过监听更改和更新数据源来避免此步骤。
你能告诉我在 Spring 启动时执行此操作的最佳方法吗?
您可以使用 Spring 的动态数据源路由并检查它是否有帮助?这是一项非常古老的技术,如果符合您的目的,可能会派上用场。
但请注意 - 这是数据源路由,而不是新的数据源配置。
https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
在我的项目中我使用了 multitenancy 。基本上我在这样的属性中定义了几个数据源:
primary.datasource.url=jdbc:postgresql://localhost:5432/db_name?currentSchema=schema_name
primary.datasource.username=user
primary.datasource.password=password
primary.datasource.driverClassName=org.postgresql.Driver
primary.datasource.driver-class-name=org.postgresql.Driver
secondary.datasource.url=jdbc:postgresql://localhost:5432/other_db?currentSchema=schema
secondary.datasource.username=user
secondary.datasource.password=password
secondary.datasource.driverClassName=org.postgresql.Driver
secondary.datasource.driver-class-name=org.postgresql.Driver
default.datasource.url=jdbc:postgresql://localhost:5432/default_db?currentSchema=public
default.datasource.username=user
default.datasource.password=password
default.datasource.driverClassName=org.postgresql.Driver
default.datasource.driver-class-name=org.postgresql.Driver
然后在配置中class定义了多个数据源:
@Bean
@Primary
@ConfigurationProperties(prefix="primary.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="secondary.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="default.datasource")
public DataSource defaultDataSource(){
return DataSourceBuilder.create().build();
}
并根据 this and this 文章配置了多租户。
优点:
- 简单的租户切换,可以手动触发,甚至可以配置为在请求(过滤器)中的某些特定 header 上触发。
- 可以配置为在模式或数据库之间切换。
- 动态发生(您不必重新启动 bean)
缺点:
- 您必须在 属性 文件中定义所有可能的数据库。
- 您必须关闭架构验证,因为它会出错。
找到了一种动态更新数据源的方法,
我已将包含数据库属性的外部 spring 配置文件提供给应用程序,然后使用数据源 bean 的 @RefreshScope 刷新属性。
线程监视文件更改并调用执行器 refresh() 方法。
database.properties
dburl=jdbc://localhost:5432/dbname
dbusername=user1
dbpassword=userpwd
正在创建数据源,
@RefreshScope
public class DBPropRefresh {
@Value("${dburl}")
private String dbUrl;
@Value("${dbusername}")
private String dbUserName;
@Value("${dbpassword}")
private String dbPassword;
@Bean
@RefreshScope
public DataSource getDatasource() {
return new DatasourceBuilder().create().url(dbUrl).username(dbUserName).password(dbPassword);
}
}
正在为应用程序提供外部配置文件,
java -jar myapplication.jar --spring.config.location=database.properties
我创建了一个 Java 线程 class 来监视 database.properties 文件更改。已关注 https://dzone.com/articles/how-watch-file-system-changes 当有变化时,它会调用 refreshEndPoint.refresh().
在pom.xml,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.6.RELEASE</version>
</dependency>