Terhubung ke kluster AnalyticDB for MySQL menggunakan driver MySQL Java Database Connectivity (JDBC).
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster AnalyticDB for MySQL dengan database dan akun (akun berhak istimewa atau akun standar)
-
Titik akhir kluster dan port (default:
3306), yang tersedia di halaman Cluster Information di Konsol AnalyticDB for MySQL
Tambahkan dependensi driver
Unduh file JAR (mysql-connector-java-x.x.x.jar) dan tambahkan ke CLASSPATH.
Versi driver yang didukung
AnalyticDB for MySQL mendukung versi driver MySQL JDBC berikut:
-
Seri 5.0: 5.0.2, 5.0.3, 5.0.4, 5.0.5, 5.0.7, dan 5.0.8
-
Seri 5.1: 5.1.1 hingga 5.1.29, serta 5.1.31, 5.1.32, 5.1.33, dan 5.1.34
-
Seri 8.0: semua versi
Format URL koneksi
jdbc:mysql://<endpoint>:<port>/<db_name>?useUnicode=true&characterEncoding=UTF-8
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<endpoint> |
Titik akhir kluster, dari halaman Cluster Information | am-xxx.ads.aliyuncs.com |
<port> |
Nomor port | 3306 (default) |
<db_name> |
Nama database | mydb |
Terhubung tanpa percobaan ulang
Gunakan try-with-resources untuk menutup koneksi, statement, dan result set secara otomatis:
String url = "jdbc:mysql://<endpoint>:3306/<db_name>?useUnicode=true&characterEncoding=UTF-8";
Properties props = new Properties();
props.put("user", "<account_name>"); // Akun berhak istimewa atau akun standar
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();
}
Ganti <endpoint>, <db_name>, <account_name>, dan <account_password> dengan nilai aktual Anda.
Terhubung dengan percobaan ulang
Untuk penggunaan produksi, terapkan logika percobaan ulang guna menangani kegagalan koneksi sementara:
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;
// Lakukan percobaan ulang saat gagal, hingga maksimal MAX_QUERY_RETRY_TIMES kali
while (retryTimes < MAX_QUERY_RETRY_TIMES) {
try {
getConn(url, connectionProps);
execQuery(query);
break; // Kueri berhasil; keluar dari 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();
}
/** Buka koneksi. */
public static void getConn(String url, Properties connectionProps) throws SQLException {
conn = DriverManager.getConnection(url, connectionProps);
}
/** Jalankan kueri sebanyak 10 kali dan cetak waktu yang diperlukan serta jumlah baris pada setiap iterasi. */
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();
}
}
}
/** Lepaskan semua sumber daya koneksi. */
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(); }
}
}
Eksekusi multi-pernyataan
Untuk menjalankan beberapa pernyataan SQL secara berurutan, aktifkan fitur multi-pernyataan sebelum eksekusi:
SET ADB_CONFIG ALLOW_MULTI_QUERIES=true;
Atur juga parameter allowMultiQueries=true dalam URL koneksi JDBC:
jdbc:mysql://<endpoint>:3306/<db_name>?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
Eksekusi multi-pernyataan memerlukan AnalyticDB for MySQL V3.1.9.3 atau versi lebih baru.
-
Untuk memeriksa versi minor kluster Edisi Data Lakehouse, jalankan
SELECT adb_version();. Untuk memperbarui versi minor kluster, hubungi dukungan teknis. -
Untuk melihat atau memperbarui versi minor kluster Edisi Data Warehouse, lihat Perbarui versi minor kluster.
FAQ
Akses Internet telah diaktifkan dan alamat IP publik dapat dijangkau, tetapi koneksi JDBC gagal.
Alamat IP publik Anda mungkin tidak ada dalam daftar putih kluster. Jalankan perintah berikut untuk mendapatkan alamat IP publik Anda, lalu tambahkan ke daftar putih alamat IP kluster Anda:
curl ipinfo.io/ip
Mengapa saya mendapatkan error "MySQL server has gone away" setelah koneksi JDBC berhasil dibuat?
Error ini biasanya disebabkan oleh timeout koneksi idle atau gangguan jaringan, dan tidak terkait dengan status kedaluwarsa langganan instans Anda.
Jika aplikasi Anda perlu mempertahankan koneksi jangka panjang, tambahkan mekanisme percobaan ulang koneksi ke dalam kode Anda. Untuk implementasi referensi, lihat bagian Connect with retries dalam dokumen ini.