Squeryl - HikariCP - mySql - Распределение трафика чтения к ведомым

Я пытаюсь выполнить шаги, перечисленные на http://dev.mysql.com/doc/connector-j/en/connector-j-master-slave-replication-connection.html котором говорится

Чтобы включить эту функцию, используйте класс com.mysql.jdbc.ReplicationDriver при настройке пула соединений сервера приложений.

С https://github.com/brettwooldridge/HikariCP - там написано

HikariCP попытается определить драйвер с помощью DriverManager, основываясь исключительно на jdbcUrl

Так нужна ли эта конфигурация?

db.default.url = jdbc: mysql: репликация...

Скверил имеет несколько АБ-адаптеров; но мое понимание, это не связано? http://squeryl.org/api/index.html

Извините за загрузку ключевого слова - я просто не уверен, где мне нужно сосредоточиться

Спасибо брент

3 ответа

Решение

И я снова здесь - пожалуйста, обратите внимание, hikari не поддерживает драйвер репликации.

https://github.com/brettwooldridge/HikariCP/issues/625

MySQL Replication Driver simply does NOT work together with HikariCP.

А также

https://groups.google.com/forum/

... nobody running anything resembling a mission critical application takes MySQL's driver-level replication support seriously.

Для людей, достигших этого в 2020 году, Хикари использует

com.mysql.jdbc.jdbc2.optional.MysqlDataSource

как источник данных. Если я посмотрю на код вышеуказанного класса. У него есть метод с именем connect, который возвращает экземпляр Connection.

protected Connection getConnection(Properties props) throws SQLException {
    String jdbcUrlToUse = null;
    if (!this.explicitUrl) {
        StringBuffer jdbcUrl = new StringBuffer("jdbc:mysql://");
        if (this.hostName != null) {
            jdbcUrl.append(this.hostName);
        }

        jdbcUrl.append(":");
        jdbcUrl.append(this.port);
        jdbcUrl.append("/");
        if (this.databaseName != null) {
            jdbcUrl.append(this.databaseName);
        }

        jdbcUrlToUse = jdbcUrl.toString();
    } else {
        jdbcUrlToUse = this.url;
    }

    Properties urlProps = mysqlDriver.parseURL(jdbcUrlToUse, (Properties)null);
    urlProps.remove("DBNAME");
    urlProps.remove("HOST");
    urlProps.remove("PORT");
    Iterator keys = urlProps.keySet().iterator();

    while(keys.hasNext()) {
        String key = (String)keys.next();
        props.setProperty(key, urlProps.getProperty(key));
    }

    return mysqlDriver.connect(jdbcUrlToUse, props);
}

где mysqlDriver - это экземпляр

protected static final NonRegisteringDriver mysqlDriver;

если я проверю метод подключения класса NonRegisteringDriver. Это выглядит так

public Connection connect(String url, Properties info) throws SQLException {
    if (url != null) {
        if (StringUtils.startsWithIgnoreCase(url, "jdbc:mysql:loadbalance://")) {
            return this.connectLoadBalanced(url, info);
        }

        if (StringUtils.startsWithIgnoreCase(url, "jdbc:mysql:replication://")) {
            return this.connectReplicationConnection(url, info);
        }
    }

    Properties props = null;
    if ((props = this.parseURL(url, info)) == null) {
        return null;
    } else if (!"1".equals(props.getProperty("NUM_HOSTS"))) {
        return this.connectFailover(url, info);
    } else {
        try {
            com.mysql.jdbc.Connection newConn = ConnectionImpl.getInstance(this.host(props), this.port(props), props, this.database(props), url);
            return newConn;
        } catch (SQLException var6) {
            throw var6;
        } catch (Exception var7) {
            SQLException sqlEx = SQLError.createSQLException(Messages.getString("NonRegisteringDriver.17") + var7.toString() + Messages.getString("NonRegisteringDriver.18"), "08001", (ExceptionInterceptor)null);
            sqlEx.initCause(var7);
            throw sqlEx;
        }
    }
}

Посмотрев на код, похоже, что он поддерживает. До сих пор не пробовал. Постараюсь сообщить вам из личного опыта. Из кода это выглядит вполне осуществимым.

Squeryl предлагает разные адаптеры MySQL, потому что innodb поддерживает ссылочные ключи, а myisam - нет. Кажется, что то, что вы делаете, должно обрабатываться на уровне пула соединений, поэтому я не думаю, что ваша конфигурация Squeryl окажет влияние.

Я никогда не настраивал Hikari для реплицируемого MySQL, но если ему требуется альтернативный драйвер JDBC, я был бы удивлен, если бы вы могли предоставить URL JDBC, и все просто работает. Я предполагаю, что по умолчанию Hikari выбирает простой ванильный драйвер MySQL JDBC, если вы не укажете иначе. К счастью, Hikari имеет довольно много опций конфигурации, включая возможность установить конкретный driverClassName,

Репликация позволяет использовать другой URL:

jdbc:mysql:replication://[server1],[server2],[server2]/[database]

Я никогда не пробовал, но я предполагаю, что это разрешит ReplicationDriver.

Другие вопросы по тегам