Seit Connector/J 3.1.7 haben wir eine Variante des Treibers
entwickelt, die Anfragen je nach dem Zustand von
Connection.getReadOnly()
automatisch an einen
lesenden und schreibenden Master oder eine Ausfallserver oder
eine nach dem Round-Robin-Verfahren lastbalancierte Gruppe von
Slaves weiterleitet.
Wenn eine Anwendung durch Aufruf von
Connection.setReadOnly(true)
signalisiert,
dass eine Transaktion nur-lesend sein soll, verwendet diese
replikationsfähige Verbindung eine der per round-robin
lastbalancierten Slave-Verbindungen (eine Verbindung verbleibt
bei einem Slave, bis dieser aus dem Dienst genommen wird). Wenn
Sie eine schreibende Transaktion haben oder eine zeitsensible
Leseoperation ausführen müssen (vergessen Sie nicht, die
Replikation in MySQL ist asynchron), dann stellen Sie die
Verbindung mit Connection.setReadOnly(false)
so ein, dass sie nicht nur-lesend ist. Der Treiber sorgt dann
dafür, dass zukünftige Aufrufe an den MySQL-Masterserver
gehen. Außerdem reicht der Server den aktuellen Zustand von
Autocommit, Isolationsebene und Katalog an alle Verbindungen
weiter, die er für diese Lastverteilungsfunktionalität
benötigt.
Um diese Funktionalität zu ermöglichen, verwenden Sie die
Klasse " com.mysql.jdbc.ReplicationDriver
",
wenn Sie den Verbindungspool Ihres Anwendungsservers
konfigurieren, oder wenn Sie eine Instanz eines JDBC-Treibers
für Ihre Standalone-Anwendung erzeugen. Da der
ReplicationDriver
dasselbe URL-Format wie der
Standard-MySQL-JDBC-Treiber akzeptiert, funktioniert er
gegenwärtig mit einem Verbindungsaufbau à la
java.sql.DriverManager
nur dann, wenn er der
einzige MySQL-JDBC-Treiber ist, der beim
DriverManager
registriert wurde.
Hier sehen Sie ein einfaches, kurzes Beispiel dafür, wie man einen ReplicationDriver in einer Standalone-Anwendung einsetzen könnte.
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(); // Für die Ausfallsicherung mit Slaves props.put("autoReconnect", "true"); // Lastverteilung zwischen den Slaves props.put("roundRobinLoadBalance", "true"); props.put("user", "foo"); props.put("password", "bar"); // // Sieht aus wie ein normaler MySQL-JDBC-URL mit einer kommagetrennten Liste von Hosts, // wobei der erste der 'Master' und die restlichen // die Slaves sind, auf die der Treiber die Last verteilt // Connection conn = driver.connect("jdbc:mysql://master,slave1,slave2,slave3/test", props); // // Lese/Schreiboperationen auf dem Master ausführen, indem // das Readonly-Flag auf "false" gesetzt wird. // conn.setReadOnly(false); conn.setAutoCommit(false); conn.createStatement().executeUpdate("UPDATE some_table ...."); conn.commit(); // // Nun eine Anfrage auf einem Slave ausführen, wobei der Treiber automatisch // einen aus der Liste auswählt // conn.setReadOnly(true); ResultSet rs = conn.createStatement().executeQuery("SELECT a,b,c FROM some_other_table"); ....... } }
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.