Squeryl - HikariCP - mySql - 向从属分发读取流量

时间:2015-04-01 13:08:19

标签: scala playframework-2.0 master-slave squeryl hikaricp

我正在尝试按照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:replication ...

Squeryl有许多数据库适配器;但我的理解是这些无关? http://squeryl.org/api/index.html#org.squeryl.adapters.MySQLInnoDBAdapter

抱歉关键词加载 - 我不太确定我需要关注的地方

由于 布伦特

4 个答案:

答案 0 :(得分:0)

Squeryl提供不同的MySQL适配器,因为innodb支持引用键,而myisam则不支持。看起来你应该在连接池级别处理你所做的事情,所以我不认为你的Squeryl配置会产生影响。

我从来没有为复制的MySQL配置Hikari,但如果它需要另一个JDBC驱动程序,如果你能提供一个JDBC URL并且一切正常,我会感到惊讶。我猜测Hikari的默认功能是选择普通的MySQL JDBC驱动程序,除非你另有说明。幸运的是,Hikari有很多config options,包括设置特定driverClassName的能力。

答案 1 :(得分:0)

复制允许使用不同的URL:

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

我从未尝试过,但我认为这会解析为ReplicationDriver。

答案 2 :(得分:0)

我发现自己回到了这里 - 请注意,hikari不支持复制驱动程序。

https://github.com/brettwooldridge/HikariCP/issues/625#issuecomment-251613688

MySQL Replication Driver simply does NOT work together with HikariCP.

https://groups.google.com/forum/#!msg/hikari-cp/KtKgzR8COrE/higEHoPkAwAJ

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

答案 3 :(得分:0)

对于在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;
        }
    }
}

看完代码后,看起来好像支持了。到目前为止,我还没有尝试过。会尝试让您从亲身经历中了解。从代码来看,它看起来直接可行。