web-dev-qa-db-fra.com

Source de données de réinitialisation d'amorçage de printemps à la volée

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?

5
vishnukumar

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>
4
vishnukumar

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/

1
Karthik R

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:

  • Commutateur de locataire facile qui peut être déclenché manuellement ou même configuré pour être déclenché sur un en-tête spécifique dans la requête (filtres).
  • Pourrait être cofiguré pour basculer entre les schémas ou les bases de données.
  • Ça se passe de façon dynamique (vous n'avez pas à redémarrer vos beans)

Les inconvénients:

  • Vous devez définir toutes les possibilités de base de données dans le fichier de propriétés.
  • Vous devez désactiver la validation du schéma car cela va devenir fou.
1
pokemzok

Jetez un coup d'œil à cet article j'espère que c'est utile :)

0
Montassar El Béhi