Conecte-se a um cluster do AnalyticDB for MySQL usando o driver MySQL Java Database Connectivity (JDBC).
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster do AnalyticDB for MySQL com um banco de dados e uma conta (privilegiada ou padrão)
O endpoint e a porta do cluster (padrão:
3306), disponíveis na página Cluster Information no console do AnalyticDB for MySQL
Adicione a dependência do driver
Baixe o arquivo JAR (mysql-connector-java-x.x.x.jar) e adicione-o ao CLASSPATH.
Versões de driver compatíveis
O AnalyticDB for MySQL é compatível com as seguintes versões do driver MySQL JDBC:
Série 5.0: 5.0.2, 5.0.3, 5.0.4, 5.0.5, 5.0.7 e 5.0.8
Série 5.1: 5.1.1, 5.1.2, 5.1.3, 5.1.4, 5.1.5, 5.1.6, 5.1.7, 5.1.8, 5.1.11, 5.1.12, 5.1.13, 5.1.14, 5.1.15, 5.1.16, 5.1.17, 5.1.18, 5.1.19, 5.1.20, 5.1.21, 5.1.22, 5.1.23, 5.1.24, 5.1.25, 5.1.26, 5.1.27, 5.1.28, 5.1.29, 5.1.31, 5.1.32, 5.1.33 e 5.1.34
Série 8.0: todas as versões
Formato da URL de conexão
jdbc:mysql://<endpoint>:<port>/<db_name>?useUnicode=true&characterEncoding=UTF-8
|
Espaço reservado |
Descrição |
Exemplo |
|
|
Endpoint do cluster, obtido na página Cluster Information |
|
|
|
Número da porta |
|
|
|
Nome do banco de dados |
|
Conexão sem novas tentativas
Use try-with-resources para fechar automaticamente a conexão, o statement e o conjunto de resultados:
String url = "jdbc:mysql://<endpoint>:3306/<db_name>?useUnicode=true&characterEncoding=UTF-8";
Properties props = new Properties();
props.put("user", "<account_name>"); // Privileged or standard account
props.put("password", "<account_password>");
Class.forName("com.mysql.jdbc.Driver");
try (Connection conn = DriverManager.getConnection(url, props);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM information_schema.tables")) {
while (rs.next()) {
System.out.println(rs.getObject(1));
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
Substitua <endpoint>, <db_name>, <account_name> e <account_password> pelos valores reais.
Conexão com novas tentativas
Para uso em produção, implemente uma lógica de nova tentativa para lidar com falhas transitórias de conexão:
public static final int MAX_QUERY_RETRY_TIMES = 3;
public static Connection conn = null;
public static Statement statement = null;
public static ResultSet rs = null;
public static void main(String[] args) throws ClassNotFoundException {
String yourDB = "<db_name>";
String username = "<account_name>";
String password = "<account_password>";
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://<endpoint>:3306/" + yourDB + "?useUnicode=true&characterEncoding=UTF-8";
Properties connectionProps = new Properties();
connectionProps.put("user", username);
connectionProps.put("password", password);
String query = "SELECT id FROM test4dmp.test LIMIT 10";
int retryTimes = 0;
// Retry on failure, up to MAX_QUERY_RETRY_TIMES attempts
while (retryTimes < MAX_QUERY_RETRY_TIMES) {
try {
getConn(url, connectionProps);
execQuery(query);
break; // Query succeeded; exit the loop
} catch (SQLException e) {
System.out.println("SQL exception: " + e.getMessage() + ". Retrying...");
try {
if (conn == null || conn.isClosed()) {
retryTimes++;
}
} catch (SQLException e1) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
}
}
}
closeResource();
}
/** Open a connection. */
public static void getConn(String url, Properties connectionProps) throws SQLException {
conn = DriverManager.getConnection(url, connectionProps);
}
/** Run the query 10 times and print elapsed time and row count for each iteration. */
public static void execQuery(String sql) throws SQLException {
Statement statement = null;
ResultSet rs = null;
statement = conn.createStatement();
for (int i = 0; i < 10; i++) {
long startTs = System.currentTimeMillis();
rs = statement.executeQuery(sql);
int cnt = 0;
while (rs.next()) {
cnt++;
System.out.println(rs.getObject(1));
}
long endTs = System.currentTimeMillis();
System.out.println("Elapsed: " + (endTs - startTs) + " ms | Rows: " + cnt);
try {
Thread.sleep(160000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/** Release all connection resources. */
public static void closeResource() {
if (rs != null) {
try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (statement != null) {
try { statement.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
Execução de múltiplos statements
Para executar vários statements SQL consecutivamente, ative o recurso de múltiplos statements antes da execução:
SET ADB_CONFIG ALLOW_MULTI_QUERIES=true;
Defina também allowMultiQueries=true na URL de conexão JDBC:
jdbc:mysql://<endpoint>:3306/<db_name>?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
A execução de múltiplos statements requer o AnalyticDB for MySQL V3.1.9.3 ou posterior.
Para verificar a versão secundária de um cluster Data Lakehouse Edition, execute
SELECT adb_version();. Para atualizar a versão secundária de um cluster, entre em contato com o suporte técnico.Para visualizar ou atualizar a versão secundária de um cluster Data Warehouse Edition, consulte Update the minor version of a cluster.
Perguntas frequentes
O acesso à internet está ativado e o endereço IP público está acessível, mas a conexão JDBC falha.
Seu endereço IP público pode não estar na lista de permissões do cluster. Execute o comando a seguir para obter seu endereço IP público e adicione-o à IP address whitelist do cluster:
curl ipinfo.io/ip
Por que recebo o erro "MySQL server has gone away" após estabelecer uma conexão JDBC?
Esse erro geralmente ocorre devido ao tempo limite de ociosidade da conexão ou a uma interrupção de rede, e não está relacionado à expiração da assinatura da instância.
Se sua aplicação precisar manter conexões de longa duração, adicione um mecanismo de nova tentativa de conexão ao código. Para uma implementação de referência, consulte a seção Conexão com novas tentativas neste documento.