Spec-Zone .ru
спецификации, руководства, описания, API

21.3.8. Выравнивание нагрузки с Connector/J

Connector/J долго обеспечивал эффективное средство распределить загрузку чтения-записи через многократные экземпляры сервера MySQL для Кластера или основного основного развертывания репликации. Запускаясь с Connector/J 5.1.3, можно теперь динамически сконфигурировать сбалансированные с загрузки соединения без отключения электричества службы. Незавершенные транзакции не теряются, и никакие исключения приложения не сгенерированы, если какое-либо приложение пытается использовать тот определенный экземпляр сервера.

Есть две опции строки подключения, связанные с этой функциональностью:

Как только соединение было сделано, используя корректные опции строки подключения, много контролирующих свойств доступны:

Следующие операции управления могут также быть выполнены:

Интерфейс JMX, com.mysql.jdbc.jmx.LoadBalanceConnectionGroupManagerMBean, имеет следующие методы:

getRegisteredConnectionGroups() метод возвращает имена всех групп соединения, определенных в том загрузчике class.

Можно протестировать эту установку со следующим кодом:

public class Test {    private static String URL = "jdbc:mysql:loadbalance://" +        "localhost:3306,localhost:3310/test?" +        "loadBalanceConnectionGroup=first&loadBalanceEnableJMX=true";    public static void main(String[] args) throws Exception {        new Thread(new Repeater()).start();        new Thread(new Repeater()).start();        new Thread(new Repeater()).start();    }    static Connection getNewConnection() throws SQLException, ClassNotFoundException {        Class.forName("com.mysql.jdbc.Driver");        return DriverManager.getConnection(URL, "root", "");    }    static void executeSimpleTransaction(Connection c, int conn, int trans){        try {            c.setAutoCommit(false);            Statement s = c.createStatement();            s.executeQuery("SELECT SLEEP(1) /* Connection: " + conn + ", transaction: " + trans + " */");            c.commit();        } catch (SQLException e) {            e.printStackTrace();        }    }    public static class Repeater implements Runnable {        public void run() {            for(int i=0; i < 100; i++){                try {                    Connection c = getNewConnection();                    for(int j=0; j < 10; j++){                        executeSimpleTransaction(c, i, j);                        Thread.sleep(Math.round(100 * Math.random()));                    }                    c.close();                    Thread.sleep(100);                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }}

После компиляции приложение может быть запущено с -Dcom.sun.management.jmxremote флаг, чтобы включить удаленному управлению. jconsole может тогда быть запущен. Test основной class будет перечислен jconsole. Выберите это и щелкните по Connect. Можно тогда переместиться к com.mysql.jdbc.jmx.LoadBalanceConnectionGroupManager боб. В этой точке можно щелкнуть по различным операциям и исследовать возвращенный результат.

Если бы у Вас теперь был дополнительный экземпляр MySQL, работающего на порту 3309, то Вы могли бы гарантировать, что Connector/J начинает использовать это при использовании addHost(), который представляется в jconsole. Отметьте, что эти операции могут быть выполнены динамически, не имея необходимость останавливать выполнение приложения.

Для дополнительной информации о комбинации выравнивания нагрузки и failover, см. Раздел 21.3.9, "Failover с Connector/J".