2017-09-04 3 views
3

春の設定ファイルやカスタムDBのプロパティファイルでDB名、パスワード、ホスト名などのDBプロパティが変更された場合、Springブートでデータソースを更新しようとしています。プロパティが変更されると、プロパティの変更をリッスンすることによって、アプリケーションが独自に更新する必要があります。オンザフライでの春ブートリセットデータソース

DB構成を変更した後は、スプリングアクチュエータを使用してBeanを再起動していました。しかし、ユーザーは明示的に再起動のためのポストリクエストを行う必要があります。このステップは、変更をリッスンしてデータソースを更新することによって回避する必要があります。

Springブートでこれを行う最善の方法を教えてもらえますか?

+0

このhttps://stackoverflow.com/questions/44716195/refresh-database-configuration-on-the-fly/44717728#44717728 –

答えて

3

私はアプリケーションにDBの特性が含まれており、次にデータソースBeanの@RefreshScopeを使用してプロパティをリフレッシュ外部スプリング設定ファイルを与えています。

スレッドがファイルの変更を監視し、アクチュエータのrefresh()メソッドを呼び出します。

データベース。プロパティデータソースの作成

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

私は、database.propertiesファイルの変更を監視するために、Javaスレッドクラスを作成しました。続きを読む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> 
+0

素晴らしいです。私はアクチュエータのリフレッシュ範囲について知らなかった。共有してくれてありがとう。 –

1

Springの動的データソースルーティングを使用して、役立つかどうか確認できますか?これは非常に古いテクニックであり、それがあなたの目的に役立つなら、便利になるかもしれません。

ただし、これはデータソースのルーティングであり、新しいデータソースの設定ではありません。

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

+0

こんにちはカルティクを見てみましょう私はこれらのデータソースルーティングのいくつかを行ってきましたが、すべてがオンザフライで接続できる事前定義のデータソースになっています。私の場合は、新しいデータソースに更新する必要があります。 – vishnukumar

+0

データソースBeanを取得し、そのプロパティを変更することは可能ですか? – vishnukumar

+0

箱から出て、私たちはそれをすることはできないと思います。私が言ったようにルーティングすることができます。しかし、プロパティを変更したときにコンテナを再起動する必要はありません。動的である必要がある場合でも、データソースを取得できるのはJNDIルックアップだけです。私はこの必要条件やこれを必要とすることはありませんでした。あなたが今のところ進めることができる唯一の方法は、スプリングアクチュエータです。 –

0

this articleを見てみましょう、それは便利です:)

+0

これは非常に便利なリンクですが、@RefreshScopeはプロパティの更新のみを行いますが、ApplicationContextのデータソースは再作成しません。私はすでにこれを試して、それは動作しません。私の質問を参照してくださいhttps://stackoverflow.com/questions/45562183/spring-boot-refreshscope-doesnt-update-datasource?noredirect=1#comment78131414_45562183 – vishnukumar

1

私のプロジェクトでは、私は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 

、構成クラスで定義された複数のデータソース:thisthis記事に基づか

@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(); 
} 

および設定マルチテナントを。
長所:手動でトリガあるいは要求(フィルタ)の一部の特定のヘッダにトリガされるように構成することができる

  • 簡単テナントスイッチ。
  • スキーマまたはデータベースを切り替えるように構成できます。あなたは、プロパティファイル内のすべてのDBの可能性を定義する必要が


    短所(あなたの豆を再起動する必要はありません)を動的に行われます。

  • スキーマの検証がオフになるため、検証をオフにする必要があります。オンザフライでデータソースを更新する方法を発見
関連する問題