Ich versuche, die Datenquelle in Spring Boot zu aktualisieren, wenn sich die DB-Eigenschaft wie DB-Name, Kennwort oder Hostname in der Spring-Konfigurationsdatei oder der benutzerdefinierten DB-Eigenschaftsdatei ändert. Wenn sich die Eigenschaft ändert, muss die Anwendung selbst aktualisieren, indem Änderungen an der Eigenschaft abgehört werden.
Ich habe Spring Actuator verwendet, um Beans neu zu starten, nachdem die DB-Konfiguration geändert wurde. Der Benutzer muss jedoch explizit eine Post-Anforderung zum Neustart stellen. Dieser Schritt muss vermieden werden, indem die Änderungen abgehört und die Datenquelle aktualisiert werden.
Kannst du mir sagen, wie das am besten im Frühjahr geht?
Es wurde eine Möglichkeit gefunden, die Datenquelle im laufenden Betrieb zu aktualisieren.
Ich habe der Anwendung eine externe Spring-Konfigurationsdatei übergeben, die DB-Eigenschaften enthält, und dann die Eigenschaften mit @RefreshScope für die Datenquellen-Bean aktualisiert.
Ein Thread überwacht die Dateiänderungen und ruft die refresh () -Methode des Aktors auf.
database.properties
dburl=jdbc://localhost:5432/dbname
dbusername=user1
dbpassword=userpwd
Datenquelle erstellen,
@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);
}
Externe Konfigurationsdatei an die Anwendung übergeben,
Java -jar myapplication.jar --spring.config.location=database.properties
Ich habe eine Java-Thread-Klasse erstellt, um die Dateiänderungen in database.properties zu überwachen. Followed https://dzone.com/articles/how-watch-file-system-changes Bei Änderungen wird refreshEndPoint.refresh () aufgerufen.
In pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.6.RELEASE</version>
</dependency>
Sie können das dynamische Datenquellen-Routing von Spring verwenden und prüfen, ob es hilft. Es ist eine sehr alte Technik und könnte nützlich sein, wenn das Ihrem Zweck dient.
Beachten Sie jedoch, dass dies Datenquellenrouting und keine neue Datenquellenkonfiguration ist.
https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
In meinem Projekt habe ich Mandantenfähigkeit verwendet. Grundsätzlich habe ich in Eigenschaften wie diesen mehrere Datenquellen definiert:
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
dann wurden in der Konfigurationsklasse mehrere Datenquellen definiert:
@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();
}
und konfigurierte Mandantenfähigkeit basierend auf diesem und diesem Artikel.
Vorteile:
Nachteile:
Werfen Sie einen Blick auf diesen Artikel Ich hoffe, es ist hilfreich :)