2012-05-11 16 views
0

いくつかのサービスを開発し、APIをいくつかの第三者に公開する必要があります。 これらのサービスでは、(単純なCRUDだけでなく)複雑な計算を伴うデータのフェッチ/挿入/更新/削除が必要な場合があります。私はSpringとMyBatisを使用する予定です。複数のデータベースを使用してフェールオーバーをサポートするSpring + MyBatisのベスト・アプローチ

しかし、実際の課題は、同じデータを持つ複数のDBノードが存在することです(いくつかの外部設定では、それらを同期させて管理することになります)。私はいくつかのデータを要求したときに、ランダムに1つのDBノードを選択してクエリを実行し、結果を返す必要があります。選択されたDBに到達できない場合や、ネットワークに問題がある場合や、未知の問題がある場合は、他のDBノードに接続する必要があります。

私はSpringのAbstractRoutingDataSourceを認識しています。しかし、どこにDB接続リトライロジックを注入するのですか?データソースを動的に切り替えると、Springはトランザクションを正しく処理しますか?

Springを避ける必要がありますか?& MyBatisはすぐに使用でき、MyBatisを使用して自分でトランザクション管理を行いますか?

あなたは何をお勧めしますか?

+0

クエリごとにランダムにデータベースを選択するのはなぜですか?実際に何かが間違っていることを実際に認識するまで、単一のサーバーを使用してみませんか? – Killnine

答えて

1

私はMongoDBのようなNoSQLデータベースを使用することを提案します。クラスタリングは簡単です。たとえば、10台のサーバーを使用して構成し、データを3回複製することができます。

これは、10台のサーバーのうち2台に障害が発生した場合でも、データを保存できることを意味します。

NoSQLデータベースはRDBSとは異なりますが、クラスタリングには高いパフォーマンスが得られます。

また、NoSQLのトランザクションサポートもありません。財務操作の場合は、手動で行う必要があります。

実際には、NoSQLを使用して開発するときは、別の方法で処理する必要があります。

+0

ご返信ありがとうございます。今はNoSQLに移行する選択肢はありません。 –

1

はい、動作します。 AbstractRoutingDataSourceを取得し、独自のコードをコーディングします。あなたができないのは、トランザクションの実行中にターゲットデータベースを変更することだけです。

これで、db再試行コードをgetConnectionに追加するだけです。トランザクション中に接続が無効になった場合は、失敗させる必要があります。

+0

私の要件はもう少し複雑です...私は接続の失敗だけでなく、特定のテーブルのロックを取得できない場合でも、リカバリ可能なdb例外をいくつか取得しています。だから私はこれらの再試行メカニズムをすべてサポートするためにAbstractRoutingDataSourceの拡張を設計しています。私は一度完成した私のブログwww.sivalabs.blogspot.comにこの拡張の詳細を掲示します。 –

関連する問題