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>