2017-07-31 19 views
0

私は顧客IDに基づいて分割された複数のMySQL DBを持っています。シャード情報(顧客IDはどのDBに属しているか)に関する詳細を提供するマイクロサービスがあります。Spring - Hibernate - 複数のデータベースを動的に設定する

はこれまでのところ、私のコードは、単一のデータソースで働いていたと私は、Hibernate設定ファイルの一部としてのSessionFactoryを提供機能を持っている:私は

@Bean 
public DataSource dataSource() { 
} 

@Bean 
public LocalSessionFactoryBean sessionFactory() { 
    // set data source here 
} 

データソースがで返されますDAOのsessionFactoryをオートワイヤリングしています:

@Autowired 
private SessionFactory sessionFactory; 

ここで、複数のd atasourceは、私が行う必要があります。microservice

  • から

    • 読み取り設定されたデータベースは、動的に
    • のSessionFactoryは、顧客IDに基づいて動的にcratedれるべきデータソースを作成するには、DBのリストを使用します。

    カスタマーIDに基づいてデータソースを初期化するようにsessionFactoryをオートワイヤリングする方法がわかりません。

    ここのヘルプは本当に感謝しています。

  • +0

    動的にはどういう意味ですか? Springはアプリケーションの起動時にBeanを設定するため、2番目のデータソースを挿入することはできません。他の春のスコープを指定した場合、SessionFactoryを動的に作成すると拡張できません。これらのオブジェクトは、起動時に作成する必要があります。 –

    +0

    修飾子で構成されたseprate Beanを持つことができ、そのうちの1つをプライマリにすることができます。最初のリクエストで必要です。 –

    +0

    データベースに関する情報は静的ではありません。この情報は、構成されているすべてのシャードされたデータベースを一覧表示する別のマイクロサービスによって提供されます。データベースは、それを管理しているマイクロサービスで追加または削除することができます。 新しい顧客IDを追加する必要がある場合、そのIDに対応するすべてのデータが個別のdbインスタンスとして追加され、マイクロサービスは新しく追加されたdbを使用してdbsの配列を返します。 – agarwalankur85

    答えて

    0

    私は今までこの質問を見ていませんでした。 hibernate 4+でこれを行う最も簡単な方法は、あなたのシャードをデータソースとしてセットアップすることです。私は個人的にコンテナ管理のデータソースを使用しましたが、別の方法で自分の接続プールを設定し維持するのは難しいでしょう。これらのデータソースには、それらに関連付けられたjndi名があり、これによって、休止状態の接続プロバイダーからの接続プールにアクセスできます。このようにすればトランザクションごとに1つのシャードにしか書き込めません。もちろん、1つのシャードだけで複数のデータソースに書き込むことはできます。関連付けられたすべてのリレーショナルデータを同じスキーマ内の同じシャードに置くように注意してください。その重要です。 Appサーバーのトランザクションレジストリを活用して、キャッシュプロバイダとすべてのデータソースの両方でJTAトランザクションへのアクセスを強化することができます。各トランザクションで1つのデータソースを除くすべてのデータソースにXAを使用することを忘れないでください。休止状態のマルチテナントを利用して、スキーマを使用する方向を指定します。 (スレッドローカルで接続プロバイダに渡され、そのデータソースの接続に割り当てられます)。論理的に同じであることを望む複数のオブジェクトは、同時に異なるクラスローダーにアタッチされる可能性があり、デフォルトでは実質的に同じではないため、equalsメソッドとhashメソッドには細心の注意を払う必要があります。このようなイベントが発生すると、これらのオブジェクトがトランザクションに含まれ、それらを永続化しようとすると、非常に奇妙な休止状態のエラーメッセージが表示されます。すべてを上書きする

    関連する問題