Spring が提供するソリューションを使用してマルチテナント アーキテクチャに移行することを決定したアプリケーションに取り組んでいるため、パラメータの値に応じてデータを各データソースにルーティングします。このパラメーターは、クライアント ID に応じて 1 から 10 までの数値であるとしましょう。
ただし、これには新しいデータソースを追加するたびにアプリケーション コンテキストを変更する必要があるため、最初に次の解決策を考えました。
- 異なる IP と同じスキーマを指す 10 個 (またはそれ以上) のデータソースから始めますが、最終的にはすべて同じ物理データベースにルーティングされます。使用するデータソースに関係なく、この最初のシナリオでは、データは同じスキーマに送信されます。
- データは同じスキーマにあるため、同じテーブルがデータソース間で共有されますが、各行は各データソースにしか表示されません (すべての CRUD 操作で固定の where 句を使用)。
- パフォーマンスの問題が発生した場合は、別のデータベースを作成し、一部のクライアントを新しいスキーマに移行し、データソースの 1 つの IP を新しいデータベースに再ルーティングして、この新しいデータベースが古いデータベースの負荷の一部を取得するようにします。
このアプローチに欠点はありますか? 私は心配しています:
- ACID プロパティが失われる
- hibernate sessionFactory と二次キャッシュの問題
- テーブルのロックの問題
Spring 3.1、Hibernate 4.1、MySQL 5.5 を使用しています。