我注意到我的Play Framework应用程序未将读取查询发送到只读MySql从站。
我正在使用
com.mysql.cj.jdbc.Driver
为javax.persistence.jdbc.driver
。jdbc:mysql:replication://write-db-url,read-db-url/db_name
为javax.persistence.jdbc.url
AWS aurora
MySQL-compatible
,副本为multi-az
。hibernate
作为ORM。play framework
。我缺少任何配置/代码吗?
答案 0 :(得分:0)
有问题的其他一切看起来都不错,例如jdbc
driver
和url
。
因为您的问题中提供的与ORM或JPA以及您正在使用的连接代码有关的信息很少。
我在这里提供一个简单的主程序,您可以使用它调试问题。完成后,请专注于您的应用程序以查看是否遗漏了相同的东西。
这是JDBC
驱动程序确定连接master
还是read replica
的方式。
read+write
,即default
,则连接模式为master
。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");
.......
}
}
希望有帮助。