3

2 つのデータベースで動作するように Spring ベースのアプリケーションを構成する必要があるという要件があります。2 つのデータベースがあります。1 つはライブ データを保持するために使用し、もう 1 つはデータ ウェアハウスとして使用され、アーカイブされたデータが含まれています (ライブ データベースとまったく同じ構造を持っています)。

簡単にするために、製品を検索する要求があるとします。アプリケーションが行うべきことは、Live データベースで製品の詳細を検索することです。見つからない場合は、アーカイブ データベースをチェックします。

このようなセットアップを構成する必要がある場合、データソースを構成する必要がありますか? 検索コードは最初のデータソースを使用してライブ データベースをチェックし、見つからない場合はアーカイブ データベースを使用して別のクエリを実行する必要がありますか?

上記はおそらく実行可能ですが、これを行うより良い方法があるかどうか疑問に思っています。たとえば、アプリケーションが実際には 2 つのデータベースで動作している場合でも、アプリケーションが 1 つのデータソースで動作することは可能ですか?

このアプリケーションは、Spring、JPA/Hibernate、SOAP、および Mysql データベースと、アプリケーション サーバーとしての Jboss 7 に基づいています。

Spring と Jboss を使用してこれを構成する方法を示す例は非常に役立ちます。

ありがとう

4

1 に答える 1

6

春にはまさにあなたが望むものがあります - AbstractRoutingDataSource. 使用方法については、このブログ記事を参照してください。あなたの場合、1回のリクエストでデータソースを切り替える必要があるため、2つのトランザクションが必要ですThreadLocal

  1. これらの DAO については、個別のパッケージ、クラス名、またはメソッド名のいずれかを使用して、ラッピング サービス層を区別します。
  2. で注釈を付けることにより、サービス層のメソッド呼び出しが独自のトランザクションコンテキストで実行される必要があることをSpringに示します@Transactional(propogation=Propogation.REQUIRES_NEW)
  3. アスペクトを作成して (AspectJ アノテーションを使用@Aspect)、サービス層メソッド呼び出しの周りで起動し (を使用@Around) ThreadLocal、メソッド呼び出しの前に値を設定し、後で設定を解除します
  4. では@Controller、サービス層のメソッドを呼び出すだけです。アスペクトは、使用するデータソースを示す値を設定し、AbstractRoutingDataSource各トランザクションのコンテキストでそのデータソースを使用します。
于 2012-05-20T14:31:25.970 に答える