Bug #49537 driver.connect is connecting just to first slave, and if it is down it hangs
| Submitted: | 8 Dec 2009 16:39 | Modified: | 16 Dec 2009 10:03 |
|---|---|---|---|
| Reporter: | zohar aharoni | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / J | Severity: | S3 (Non-critical) |
| Version: | 5.1.10 | OS: | Any |
| Assigned to: | Mark Matthews | CPU Architecture: | Any |
| Tags: | connector, java, loadbalance, replication | ||
[11 Dec 2009 0:16]
Todd Farmer
Proposed patch
Attachment: diff.txt (text/plain), 1011 bytes.
[11 Dec 2009 6:31]
Tonci Grgin
Pending Mark's review and based on Todd's test I'm marking this verified as described with workaround being "use most trusted box for first slave".
[14 Dec 2009 16:42]
Mark Matthews
Fixed for 5.1.11, from the changelog:
- "Replication" connections (those with URLs that start with
jdbc:mysql:replication) now use a jdbc:mysql:loadbalance connection
under the hood for the slave "pool". This also means that one can set
load balancing properties such as "loadBalanceBlacklistTimeout" and
"loadBalanceStrategy" to choose a mechanism for balancing the load and
failover/fault tolerance strategy for the slave pool. This work was done
in order to fix Bug#49537.
[16 Dec 2009 10:03]
Tony Bedford
A 'change' entry has been added to the 5.2.11 changelog: Replication connections, those with URLs that start with jdbc:mysql:replication, now use a jdbc:mysql:loadbalance connection for the slave pool. This means that it is possible to set load balancing properties such as loadBalanceBlacklistTimeout and loadBalanceStrategy in order to choose a mechanism for balancing the load, and failover or fault tolerance strategy for the slave pool.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.044 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: Hi, I'm trying to use the replication awareness of mysql driver. I took your general example (see "how to repeat" section). Than I stopped the first slave in the list and ran it to see if it will connect the next slave in the list. driver.connect hung until I started the slave again... Also - when I ran it in a loop with readonly = true. I always got connection to the first slave and not to the others. I would expect: 1st connection - 1st slave 2st connection - 2st slave 3st connection - 3st slave 4st connection - 1st slave ... Thanks, Zohar How to repeat: package com.myApp.CJTest; 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", "root"); props.put("password", ""); // 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://m1,s1,s2,s3/test", props); // Perform read/write work on the master // by setting the read-only flag to "false" conn.setReadOnly(false); conn.setAutoCommit(false); ResultSet rs = null; rs = conn.createStatement().executeQuery("SELECT host FROM test.hostname"); if (rs.next()) System.out.println(rs.getString(1)); // Now, do a query from a slave, the driver automatically picks one // from the list conn.setReadOnly(true); rs = conn.createStatement().executeQuery("SELECT host FROM test.hostname"); if (rs.next()) System.out.println(rs.getString(1)); } } Suggested fix: driver.connect hung until I started the slave again... -- I would expect it to connect to the next available slave. Also - when I ran it in a loop with readonly = true. I always got connection to the first slave and not to the others. I would expect: 1st connection - 1st slave 2st connection - 2st slave 3st connection - 3st slave 4st connection - 1st slave ...