J'essaie de mettre à jour une source de données dans Spring Boot lorsque la propriété de la base de données, telle que le nom, le mot de passe ou le nom d'hôte de la base de données, est modifiée dans le fichier de configuration du printemps ou dans le fichier de propriétés de la base de données personnalisé. Lorsque la propriété change, l'application doit se mettre à jour par elle-même en écoutant les modifications apportées à la propriété.
J'utilisais Spring pour relancer/relancer des beans une fois la configuration de la base de données modifiée. Mais l'utilisateur doit explicitement faire une demande de publication pour redémarrer. Cette étape doit être évitée en écoutant les modifications et en mettant à jour la source de données.
Pouvez-vous me dire la meilleure façon de faire cela dans la botte de printemps?
Trouvé un moyen de mettre à jour la source de données à la volée,
J'ai donné à l'application un fichier de configuration externe qui contient les propriétés de la base de données, puis actualisé les propriétés à l'aide de @RefreshScope pour le bean source de données.
Un thread surveille les modifications de fichier et appelle la méthode refresh () de l'actionneur.
database.properties
dburl=jdbc://localhost:5432/dbname
dbusername=user1
dbpassword=userpwd
Création de la source de données,
@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);
}
Donner un fichier de configuration externe à l'application,
Java -jar myapplication.jar --spring.config.location=database.properties
J'ai créé une classe de thread Java pour surveiller les modifications du fichier database.properties. Suivi https://dzone.com/articles/how-watch-file-system-changes Quand il y a des changements, il est appelé avec refreshEndPoint.refresh ().
Dans pom.xml,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.6.RELEASE</version>
</dependency>
Vous pouvez utiliser le routage de source de données dynamique de Spring et vérifier s'il vous aide? C'est une technique très ancienne et peut s'avérer utile si cela vous convient.
Mais notez bien que ceci est le routage de la source de données et non la nouvelle configuration de la source de données.
https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
Dans mon projet, j'ai utilisé multitenancy . En gros, j'ai défini plusieurs sources de données dans des propriétés comme celle-ci:
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
puis dans la classe de configuration définie plusieurs sources de données:
@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();
}
et configuré multitenancy basé sur this et this article.
Avantages:
Les inconvénients:
Jetez un coup d'œil à cet article j'espère que c'est utile :)