Connector/J 3.1.7
からは、クエリを自動的に読込/書込マスタに送るドライバの変異型か、Connection.getReadOnly()
の状況によってフェイルオーバかラウンドロビンのロードバランスされたスレーブのセットを利用できるようにしています。
アプリケーションは、Connection.
setReadOnly(true)
の呼び出しによって、トランザクションを読み出し専用にする信号を出します。この複製を考慮した接続は、ラウンドロビン
スキーマを使用するロードバランスされた per-vm
であるスレーブ接続のひとつを使用します (
供給された接続は、スレーブがサービスから削除されない限り、スレーブに付着します
)
。書込トランザクションがある場合、または時間に敏感な読み込みがある場合
( MySQL での複製は非同期なので注意 )
、Connection.setReadOnly(false)
を呼び出し、接続が読み込み専用にならないよう設定すると、ドライバは以後の呼び出しが確実にマスタ
MySQL
サーバに送られるようにします。ドライバは、このロードバランス機能の完遂に使用するすべての接続間の自動コミット、隔離レベル、およびカタログの現状
の伝搬を行います。
この機能を有効にするには、アプリケーション
サーバの接続プールを構成する時か、スタンドアロン
アプリケーションに JDBC
ドライバのインスタンスを作成する時に、"
com.mysql.jdbc.ReplicationDriver
"
クラスを使用します。URL フォーマットを標準の
MySQL JDBC
ドライバとして受け入れるので、ReplicationDriver
は現在、それが DriverManager
に登録された唯一の MySQL JDBC
ドライバでない限り、java.sql.DriverManager
ベースの接続作成とは作動しません。
以下は、ReplicationDriver のスタンドアロン アプリケーションでの、手短で簡単な使用例です :
import java.sql.Connection; import java.sql.ResultSet; import java.util.Properties; import com.mysql.jdbc.ReplicationDriver; public class ReplicationDriverDemo { public static void main(String[] args) throws Exception { ReplicationDriver driver = new ReplicationDriver(); Properties props = new Properties(); // We want this for failover on the slaves props.put("autoReconnect", "true"); // We want to load balance between the slaves props.put("roundRobinLoadBalance", "true"); props.put("user", "foo"); props.put("password", "bar"); // // Looks like a normal MySQL JDBC url, with a // comma-separated list of hosts, the first // being the 'master', the rest being any number // of slaves that the driver will load balance against // Connection conn = driver.connect("jdbc:mysql://master,slave1,slave2,slave3/test", props); // // Perform read/write work on the master // by setting the read-only flag to "false" // conn.setReadOnly(false); conn.setAutoCommit(false); conn.createStatement().executeUpdate("UPDATE some_table ...."); conn.commit(); // // Now, do a query from a slave, the driver automatically picks one // from the list // conn.setReadOnly(true); ResultSet rs = conn.createStatement().executeQuery("SELECT a,b FROM alt_table"); ....... } }