Spring構成ファイルまたはカスタムDBプロパティファイルでDB名、パスワード、ホスト名などのDBプロパティが変更されたときに、SpringBootでデータソースを更新しようとしています。プロパティが変更されると、アプリケーションはプロパティの変更をリッスンして独自に更新する必要があります。
DB構成が変更されたら、Springアクチュエータを使用してBeanを/再起動していました。ただし、ユーザーは再起動するために明示的にPOSTリクエストを行う必要があります。この手順は、変更をリッスンしてデータソースを更新することで回避する必要があります。
SpringBootでこれを行うための最良の方法を教えてください。
オンザフライでデータソースを更新する方法を見つけました。
DBプロパティを含む外部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 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の動的データソースルーティングを使用して、それが役立つかどうかを確認できますか?これは非常に古い手法であり、目的にかなう場合に役立つ可能性があります。
ただし、これはデータソースルーティングであり、新しいデータソース構成ではないことに注意してください。
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
次に、構成クラスで複数のデータソースを定義しました。
@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 および this の記事に基づいてマルチテナンシーを構成しました。
長所:
短所: