2016-11-28 53 views
0

私は、独自のデータソース(DB1を呼び出しましょう)が正しく動作するプロパティで設定されたspringbootアプリケーションを持っています。SpringBootを使用して動的データソースを作成する方法

しかし、このアプリケーションでは、ユーザが以前に通知してDB1に保存したいくつかのパラメータを使用して、新しいデータソース(DB2)を設定する必要があります。

私の考えは、アプリケーションの特定の部分がDB2テーブルへのアクセスに使用できるように、名前付きBeanを作成することです。私はアプリケーションを再起動することでそれを行うことは可能だと思いますが、私はそれを避けたいと思います。

さらに、私のコードのいくつかの部分で新しいデータソース(バネデータjpa、マッピングなど)を使用する必要があります。私はこの問題はわかりませんが、それはWebアプリケーションなので、リクエストスレッドのデータソースのみを作成することはできません。

私を助けることができますか?

ありがとうございます。

+0

接続パラメータを取得するための最初の 'EntityManager'を注入し、' @ PostConstruct'アノテーションを使用して2番目のデータソースを作成するという解決策が見つかりました。このアプローチの唯一の問題は、パラメータが正しくない場合にアプリケーションを再起動する必要があることです。 –

答えて

1

Springには、動的なデータソースルーティングがあります。私の場合、それは同じスキーマ(WR/RO)である

public class RoutingDataSource extends AbstractRoutingDataSource { 

    @Autowired 
    private DataSourceConfig dataSourceConfig; 

    @Override 
    protected Object determineCurrentLookupKey() { 
    return DbContextHolder.getDbType(); 
    } 

    public enum DbType { 
    MASTER, WRITE, READONLY, 
    } 

その後、カスタム注釈やアスペクト

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ReadOnlyConnection { 
} 

@Aspect 
@Component 
@Order(1) 
public class ReadOnlyConnectionInterceptor { 

    Pointcut(value = "execution(public * *(..))") 
    public void anyPublicMethod() {} 

    @Around("@annotation(readOnlyConnection)") 
    public Object proceed(ProceedingJoinPoint proceedingJoinPoint, ReadOnlyConnection readOnlyConnection) throws Throwable   { 
    Object result = null; 
    try { 
     DbContextHolder.setDbType(DbType.READONLY); 
     result = proceedingJoinPoint.proceed(); 
     DbContextHolder.clearDbType(); 
     return result; 
    } finally { 
     DbContextHolder.clearDbType(); 
    } 
    } 
} 

を必要とする。そして、あなたはタグ@ReadOnlyConnectionをごDBに基づいて行動することができます

@Override 
@Transactional(readOnly = true) 
@ReadOnlyConnection 
public UnitDTO getUnitById(Long id) { 
    return unitRepository.findOne(id); 
} 

例はhttps://github.com/afedulov/routing-data-sourceです。

実行時の依存性(つまり、休止状態のシャーディング)を解決する必要があるため、まだ作業中ですが、それを私の作業の基礎として使用しました。

+0

リンクのみの回答を提供しないでください。リンクが壊れてしまい、回答が無関係になります。あなたのポストに最も重要なビットを直接置く。 – YakovL

+0

合意。フルソースリンクでの動作の例を追加 – Oberst

関連する問題