私のアプリケーションは、2 つのMySQL 5.6 (実際にはAmazon Aurora ) インスタンスのフェイルオーバー クラスターに接続します。アクティブ ノードは常に書き込みアクセス可能ですが、パッシブ ノードはモードで実行されています (これは、すべてのスレーブ ノードがデフォルトで書き込みアクセス可能である正規のMySQLread_only
フェールオーバー クラスターとは異なります)。Amazon RDSは、常にアクティブなMySQLノードの IP アドレスを指すシンボリック DNS 名を提供します。
フェールオーバー プロセス中に、以前のマスターはread_only
モードで再起動されますが、以前のパッシブ ノードは書き込みアクセス可能になり、マスターに昇格します。また、DNS レコードが変更され、クラスターの DNS 名が新しいマスター ノードを指すようになりました。
Java 側で DNS キャッシングを完全に無効にしても (sun.net.inetaddr.ttl
またはを介してnetworkaddress.cache.ttl
)、OS 固有の DNS キャッシングは引き続き有効であるため、データベースのフェイルオーバー後に DBCP プールが読み取り専用のMySQLインスタンスへの接続でいっぱいになることになります。これらの接続は ですvalid
。つまり、フェイルオーバーの完了後、DNS キャッシュの有効期限が切れる前に取得されています。さらに、そのような接続にはreadOnly
フラグが設定されていないため、DML を実行するまで読み取り専用インスタンスと通信しているかどうかを判断できませんER_OPTION_PREVENTS_STATEMENT
。setReadOnly(false)
フラグを呼び出して設定することで明示的に読み取り/書き込みモードに接続してもreadOnlyPropagatesToServer
、ドライバーが送信するだけです。SET SESSION TRANSACTION READ WRITE
これにより、例外がスローされることはありません。
アプリケーション ロジックにできるだけ影響を与えずに、この問題を解決したいと考えています。これは、読み取り専用インスタンスへの接続を無効/閉じられた接続として扱う (つまり、プールから削除する) 方法があれば実現できます。
追加のロジックが関連付けられているような検証クエリを使用できますか? SHOW GLOBAL VARIABLES LIKE 'read_only'
検証クエリが返すスカラー値に基づいて、接続に関してプールの動作に影響を与えることは可能ですか?