Replication-AwareなConnection

ちょっと前の情報だけど,Java+MySQLレプリケーションを使っている人に朗報.

Connector/J 3.1.5から"Replication-Aware"なConnectionというのが実装された.この機能が提供される前はおそらく開発者自身が2つのデータソースを使い分けないとmaster/slaveを負荷分散目的での使い分けができなかったと思うのだけれども,これによってかなり透過的にそれを行うことができるようになる.

簡単に言うと,この新しいタイプのConnectionはmaster+slave*nのデータソースを1つにまとめて使いたい人向けのラッパーのようなもの.

使う上でのポイントは以下.

  • Driverクラスとして"com.mysql.jdbc.Driver"ではなく"com.mysql.jdbc.ReplicationDriver"を使う
  • JDBC接続URLのところで接続先を指定する際に(MySQL Clusterの時と同じように),カンマでホスト名を区切って列挙する.ただしmasterが1番目,slaveは2番目以降に書く.例:"jdbc:mysql://master,slave1,slave2,slave3/test"
  • プロパティ autoReconnect=true を設定
  • プロパティ roundRobinLoadBalance=true を設定
  • 読み込み専用トランザクションの場合,Connection.setReadOnly(true)を呼んでから処理を実行する.
  • 書き込みのあるトランザクションの場合,Connection.setReadOnly(false)を呼んでから処理を実行する.
  • MySQLレプリケーションは非同期なので書き込み直後のデータも絶対読みたい場合にはConnection.setReadOnly(false)を選択.