Java JPA负载平衡读取查询以读取MySql DB从属

时间:2019-07-08 11:19:37

标签: java mysql hibernate jpa playframework

我注意到我的Play Framework应用程序未将读取查询发送到只读MySql从站。

我正在使用

  1. com.mysql.cj.jdbc.Driverjavax.persistence.jdbc.driver
  2. jdbc:mysql:replication://write-db-url,read-db-url/db_namejavax.persistence.jdbc.url
  3. 数据库为AWS aurora MySQL-compatible,副本为multi-az
  4. 我使用hibernate作为ORM。
  5. 我正在使用play framework

我缺少任何配置/代码吗?

1 个答案:

答案 0 :(得分:0)

有问题的其他一切看起来都不错,例如jdbc driverurl

因为您的问题中提供的与ORM或JPA以及您正在使用的连接代码有关的信息很少。

我在这里提供一个简单的主程序,您可以使用它调试问题。完成后,请专注于您的应用程序以查看是否遗漏了相同的东西。

这是JDBC驱动程序确定连接master还是read replica的方式。

  1. 如果连接模式为read+write,即default,则连接模式为master
  2. 如果连接模式为read,则它将转到read-replica之一。

这里正式documentation

import java.sql.Connection;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Properties;
import java.sql.DriverManager;

public class ReplicationDemo {

public static void main(String[] args) throws Exception {

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", "foo");
props.put("password", "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 =
    DriverManager.getConnection("jdbc:mysql:replication://master,slave1,slave2,slave3/test",
        props);

//
// Perform read/write work on the master
// by setting the read-only flag to "false"
//

conn.setReadOnly(false);
conn.setAutoCommit(false);
conn.createStatement().executeUpdate("UPDATE some_table ....");
conn.commit();

//
// Now, do a query from a slave, the driver automatically picks one
// from the list
//

conn.setReadOnly(true);

ResultSet rs =
  conn.createStatement().executeQuery("SELECT a,b FROM alt_table");

 .......
}
}

希望有帮助。