本文介紹如何在Java中通過MySQL JDBC串連AnalyticDB for MySQL叢集。
MySQL JDBC驅動版本
AnalyticDB for MySQL支援以下版本的MySQL JDBC驅動。
5.0版本系列:5.0.2,5.0.3,5.0.4,5.0.5,5.0.7,5.0.8。
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, 5.1.34。
MySQL 8.0。
注意事項
Java中建立MySQL JDBC串連依賴於MySQL-JDBC驅動包,您需要手動將MySQL-JDBC驅動包(mysql-connector-java-x.x.x.jar)加入到
CLASSPATH
中,否則無法建立MySQL JDBC串連。若您需要使用Multi-Statement功能連續執行多個SQL語句時,請執行
SET ADB_CONFIG ALLOW_MULTI_QUERIES=true;
命令手動開啟Multi-Statement功能,並將配置JDBC串連屬性allowMultiQueries
配置為true
。說明僅3.1.9.3及以上核心版本的叢集支援Multi-Statement功能。
查看湖倉版叢集的核心版本,請執行
SELECT adb_version();
。如需升級核心版本,請聯絡支援人員。查看和升級數倉版叢集的核心版本,請參見查看和升級版本。
不帶重試的JDBC串連樣本
您可以在業務系統的Java代碼中添加以下代碼,通過MySQL JDBC串連AnalyticDB for MySQL叢集。
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
//adb_url是AnalyticDB MySQL叢集的串連地址URL,可以在控制台的叢集資訊頁面擷取串連URL,3306是連接埠號碼。
//db_name是AnalyticDB MySQL叢集中的資料庫名稱。
String url = "jdbc:mysql://adb_url:3306/db_name?useUnicode=true&characterEncoding=UTF-8";
Properties connectionProps = new Properties();
//account_name是AnalyticDB MySQL叢集中的使用者帳號:高許可權帳號或者普通帳號。
connectionProps.put("user", "account_name");
//account_password是AnalyticDB MySQL叢集中使用者帳號對應的密碼。
connectionProps.put("password", "account_password");
connection = DriverManager.getConnection(url, connectionProps);
statement = connection.createStatement();
String query = "select count(*) from information_schema.tables";
rs = statement.executeQuery(query);
while (rs.next()) {
System.out.println(rs.getObject(1));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
帶重試的JDBC串連樣本
在JDBC中通過配置參數可以實現串連重試機制。
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 {
//AnalyticDB MySQL叢集中的資料庫名稱。
String yourDB = "db_name";
//AnalyticDB MySQL叢集中的使用者帳號:高許可權帳號或者普通帳號。
String username = "account_name";
//AnalyticDB MySQL叢集中使用者帳號對應的密碼。
String password = "account_password";
Class.forName("com.mysql.jdbc.Driver");
//adb_url是AnalyticDB MySQL叢集的串連地址URL,可以在控制台的叢集資訊頁面擷取串連URL,3306是連接埠號碼。
String url = "jdbc:mysql://adb_url: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;
// 通過迴圈自動重試。
while (retryTimes < MAX_QUERY_RETRY_TIMES) {
try {
getConn(url, connectionProps);
execQuery(query);//執行query。
break; // query執行成功後,結束整個迴圈。
} catch (SQLException e) {
System.out.println("Met SQL exception: " + e.getMessage() + ", then go to retry task ...");
try {
if (conn == null || conn.isClosed()) {
retryTimes++;
}
} catch (SQLException e1) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e2) {
e.printStackTrace();
}
}
}
}
}
// Clear connection resource.
closeResource();
}
/**
* Get connection.
*
* @param url
* @param connectionProps
* @throws SQLException
*/
public static void getConn(String url, Properties connectionProps) throws SQLException {
conn = DriverManager.getConnection(url, connectionProps);
}
/**
* Query task execution logic.
*
* @param sql
* @throws SQLException
*/
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("Elapse Time: " + (endTs - startTs));
System.out.println("Row count: " + cnt);
try {
Thread.sleep(160000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* Close connection resource.
*/
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();
}
}
}
常見問題
Q:為什麼已開通了公網,且公網地址可以ping通,但JDBC串連失敗?
A:請執行curl ipinfo.io/ip
命令,查看公網IP地址,然後將該其添加到叢集的IP白名單中。具體操作請參見設定白名單。