2017-01-05 16 views
1

私たちは多くのアプリケーションをクラウドに移行していますが、一部のローカルハードウェアとのインターフェイスとして社内にとどまる必要があるアプリケーションもあります。SpringブートJPAスレーブキャッシュ

問題のアプリケーションはSpring Bootを使用して書かれており、時折書き込むだけでMYSQLデータベースで90%の読み取り操作を行います。社内サーバーがクラウドデータベースサーバーのレプリケーションスレーブとして機能するマスタースレーブMYSQLレプリケーションをセットアップしました。

書き込み操作をクラウドデータベースサーバーに送信する際に、すべての読み取り操作に社内データベースを使用するようにSpringブートを構成するにはどうすればよいですか。

私は、アプリケーション全体を2つの異なるデータソースを使用するように再構成できることを知っていますが、これは面白い方法かもしれません。

+1

MariaDBからMaxScaleを使用できます。それはDBプロキシです。しかし、クエリ(INSERT/UPDATE)をクラウドに送信してスレーブを直接読み込むと、INSERTはほとんどレプリケートされませんでした。それは少し使用することができます。あなたはまた、より多くのルールを設定することができます。** SELECT/** MASTER */* FROM .... ** –

+0

のようなマスターからも読むために、SELECTの特別なキーワードをルーティングすることもできます。私はそれを徹底的に調べます。 MaxScaleやMaster/Slaveレプリケーションでアップデートを送信してすぐにクエリを実行することは問題ですか? – schneida

+0

それもmaxscaleの問題ではありません。マスターからスレーブへの結果を複製するのに複製が少し遅くなります。このようなクエリを特定する場合は、これをマークしてmaxscaleのルールを作成して、このクエリもマスターに行くことができます。 –

答えて

1

これは最初にスレーブを接続文字列の一部として指定することで実現します。

conn.setReadOnly(false); 
conn.setAutoCommit(false); 

の例では、春はあなたの接続を管理している場合は、手動でそれをやって示しているが、あなたは時にスレーブを指定することができます。here

Connection conn = driver.connect("jdbc:mysql://master,slave1,slave2,slave3/test", 
     props); 

そして唯一の(同じソース)を読み取るために接続を設定することから、 Springの管理用にDataSourceを作成し、SpringのreadOnlyトランザクション設定を使用してこれを実行します(hereを参照)。

+0

良い点 - これはMYSQLドライバ自体の機能である可能性があるという事実を認識していませんでした。しかし、ちょっとしたグーグルで、私は という特殊な構文を見つけました。jdbc:mysql:loadbalance:// localhost:3306、localhost:3310/sakilaまたは jdbc:mysql:replication:// master、slave1、slave2、slave3/test (出典:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html) 私はあなたの例にこれを使用する必要がありますか? – schneida

関連する問題