Java JPA Запросы чтения балансировки нагрузки для чтения MySql DB slave - PullRequest
3 голосов
/ 08 июля 2019

Я заметил, что мое приложение Play Framework не отправляет запросы на чтение ведомому MySql только для чтения.

Я использую

  1. com.mysql.cj.jdbc.Driver как javax.persistence.jdbc.driver.
  2. jdbc:mysql:replication://write-db-url,read-db-url/db_name как javax.persistence.jdbc.url
  3. ДБ AWS aurora MySQL-compatible с репликой multi-az.
  4. Я использую hibernate в качестве ORM.
  5. Я использую play framework.

Мне не хватает какой-либо конфигурации / кода?

1 Ответ

0 голосов
/ 12 июля 2019

Все остальное выглядит хорошо, как указано в вопросе, как jdbc driver и url.

Поскольку в вашем вопросе предоставлено очень мало информации, связанной с ORM или JPA и кодами подключения, которые вы используете.

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

Вот как JDBC драйвер определяет, подключить ли master или read replica.

  1. Если режим соединения read+write, то есть default, то он переходит к master.
  2. Если режим соединения read, то он переходит к одному из read-replica.

Здесь официально Документация .

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");

 .......
}
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...