Hibernate 3.3.2 を永続化フレームワークとして使用し、Apache Tomcat 7.0.27 をサーバーとして使用して、Java Web アプリケーションを開発しました。このアプリケーションは、MySQL 5.5 Replication Servers (マスター 1 つ、スレーブ 1 つ) を使用するように正常にセットアップされました。読み取り専用クエリは後者で実行され、その他はマスター インスタンスで実行されます。
ここで問題が発生します。DB フェイルオーバーをテストしたいと考えています。つまり、ある時点でスレーブ MySQL インスタンスを停止し、アプリケーションが読み取り専用クエリで正常に動作することを確認したいと考えています。次の記事MySQL Failover with Connector/Jから理解した限りでは、これはコードを変更しなくても可能であるはずです。まず、2 番目のケースに関心があります: 通信例外 ("08" で始まる SQL 状態)。残念ながら、これは起こりません。スレーブを停止すると、サーバーからの応答を取得するのに非常に長い時間がかかる場合があり、何も返されず、HTTP 接続がスタックする場合があります。Tomcat ログで、次の行を取得します。
サーバーから正常に受信された最後のパケットは、N ミリ秒前です。サーバーに正常に送信された最後のパケットは 0 ミリ秒前です。
以下は、休止状態の構成のスニペットです。
<property name="hibernate.connection.driver_class">com.mysql.jdbc.ReplicationDriver</property>
<property name="hibernate.connection.url">jdbc:mysql://masterIP,slaveIP/mydb?loadBalancePingTimeout=1500&loadBalanceBlacklistTimeout=7000&autoReconnect=true&failOverReadOnly=false&roundRobinLoadBalance=true</property>
MySQL コネクタのドキュメントを参照しながら、多くのプロパティ構成を試しましたが、信頼できるフェイルオーバーを取得する方法がわかりません。