web-dev-qa-db-ja.com

SpringBootリセットデータソースをオンザフライで

Spring構成ファイルまたはカスタムDBプロパティファイルでDB名、パスワード、ホスト名などのDBプロパティが変更されたときに、SpringBootでデータソースを更新しようとしています。プロパティが変更されると、アプリケーションはプロパティの変更をリッスンして独自に更新する必要があります。

DB構成が変更されたら、Springアクチュエータを使用してBeanを/再起動していました。ただし、ユーザーは再起動するために明示的にPOSTリクエストを行う必要があります。この手順は、変更をリッスンしてデータソースを更新することで回避する必要があります。

SpringBootでこれを行うための最良の方法を教えてください。

7
vishnukumar

オンザフライでデータソースを更新する方法を見つけました。

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

Springの動的データソースルーティングを使用して、それが役立つかどうかを確認できますか?これは非常に古い手法であり、目的にかなう場合に役立つ可能性があります。

ただし、これはデータソースルーティングであり、新しいデータソース構成ではないことに注意してください。

https://spring.io/blog/2007/01/23/dynamic-datasource-routing/

1
Karthik R

見てください この記事 お役に立てば幸いです:)

0

私のプロジェクトでは、 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 の記事に基づいてマルチテナンシーを構成しました。
長所:

  • 手動でトリガーすることも、リクエスト内の特定のヘッダー(フィルター)でトリガーするように構成することもできる簡単なテナント切り替え。
  • スキーマまたはデータベースを切り替えるように構成できます。
  • 動的に発生します(Beanを再起動する必要はありません)

短所:

  • プロパティファイルですべてのデータベースの可能性を定義する必要があります。
  • スキーマ検証は面倒なので、オフにする必要があります。
0
pokemzok