Connectez-vous à un cluster AnalyticDB for MySQL à l'aide du pilote MySQL Java Database Connectivity (JDBC).
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster AnalyticDB for MySQL doté d'une base de données et d'un compte (privilégié ou standard)
L'endpoint et le port du cluster (par défaut :
3306), disponibles sur la page Cluster Information dans la console AnalyticDB for MySQL
Ajout de la dépendance du pilote
Téléchargez le fichier JAR (mysql-connector-java-x.x.x.jar) et ajoutez-le au CLASSPATH.
Versions de pilotes prises en charge
AnalyticDB for MySQL prend en charge les versions suivantes du pilote MySQL JDBC :
Série 5.0 : 5.0.2, 5.0.3, 5.0.4, 5.0.5, 5.0.7 et 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 et 5.1.34
Série 8,0 : toutes les versions
Format de l'URL de connexion
jdbc:mysql://<endpoint>:<port>/<db_name>?useUnicode=true&characterEncoding=UTF-8
| Espace réservé | Description | Exemple |
|---|---|---|
<endpoint> |
Endpoint du cluster, disponible sur la page Cluster Information | am-xxx.ads.aliyuncs.com |
<port> |
Numéro de port | 3306 (par défaut) |
<db_name> |
Nom de la base de données | mydb |
Connexion sans nouvelle tentative
Utilisez l'instruction try-with-resources pour fermer automatiquement la connexion, l'instruction et le jeu de résultats :
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();
}
Remplacez <endpoint>, <db_name>, <account_name> et <account_password> par vos valeurs réelles.
Connexion avec nouvelles tentatives
Pour une utilisation en production, implémentez une logique de nouvelle tentative afin de gérer les échecs de connexion transitoires :
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(); }
}
}
Exécution de plusieurs instructions
Pour exécuter plusieurs instructions SQL consécutivement, activez la fonctionnalité multi-instructions avant l'exécution :
SET ADB_CONFIG ALLOW_MULTI_QUERIES=true;
Définissez également allowMultiQueries=true dans l'URL de connexion JDBC :
jdbc:mysql://<endpoint>:3306/<db_name>?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
L'exécution de plusieurs instructions nécessite AnalyticDB for MySQL V3.1.9.3 ou une version ultérieure.
Pour vérifier la version mineure d'un cluster Data Lakehouse Edition, exécutez
SELECT adb_version();. Pour mettre à jour la version mineure d'un cluster, contactez le support technique.Pour afficher ou mettre à jour la version mineure d'un cluster Data Warehouse Edition, consultez la rubrique Mise à jour de la version mineure d'un cluster.
FAQ
L'accès Internet est activé et l'adresse IP publique est accessible, mais la connexion JDBC échoue.
Votre adresse IP publique ne figure peut-être pas sur la liste d'autorisation du cluster. Exécutez la commande suivante pour obtenir votre adresse IP publique, puis ajoutez-la à la liste d'autorisation des adresses IP de votre cluster :
curl ipinfo.io/ip
Pourquoi obtiens-je une erreur « MySQL server has gone away » après avoir établi une connexion JDBC ?
Cette erreur est généralement causée par un délai d'inactivité de la connexion ou une interruption réseau. Elle n'est pas liée à l'expiration éventuelle de l'abonnement de votre instance.
Si votre application doit maintenir des connexions de longue durée, ajoutez un mécanisme de nouvelle tentative de connexion à votre code. Pour une implémentation de référence, consultez la section Connexion avec nouvelles tentatives de ce document.