通過JDBC連接MySQL實例
更新時間 2024-11-15 12:29:44
最近更新時間: 2024-11-15 12:29:44
分享文章
本頁介紹如何通過JDBC連接關系數據庫MySQL版。
通過JDBC連接實例的方式有無需下載SSL證書連接和用戶下載SSL證書連接兩種,其中使用SSL證書連接通過了加密功能,具有更高的安全性。MySQL新實例默認關閉SSL數據加密,開啟SSL請參考設置SSL數據加密。SSL連接實現了數據加密功能,但同時也會增加網絡連接響應時間和CPU消耗,不建議開啟SSL數據加密。
前提條件
用戶需要具備以下技能:
- 熟悉計算機基礎知識。
- 了解JAVA編程語言。
- 了解JDBC基礎知識。
使用SSL證書連接
說明使用SSL證書連接實例,即通過證書校驗并連接數據庫。
-
下載CA證書。
- 在天翼云官網首頁的頂部菜單欄,選擇產品?>?數據庫?>?關系型數據庫?>?關系數據庫MySQL版,進入關系數據庫MySQL產品頁面。然后單擊管理控制臺,進入TeleDB數據庫概覽頁面。
- 在左側導航欄,選擇MySQL?>?實例管理,進入實例列表頁面。然后在頂部菜單欄,選擇區域和項目。
- 在實例列表中,單擊目標實例名稱,進入實例基本信息頁面。
- 在網絡區域,單擊SSL狀態參數右側的下載證書。
-
使用keytool工具通過CA證書生成truststore文件。
說明Keytool是Java開發工具包中的一個命令行工具,可用于管理密鑰和證書。
如果您的系統中安裝了Java并配置了正確的環境變量,則可以直接使用keytool命令。
如果您的系統中沒有安裝Java,請先安裝Java,然后配置環境變量再使用keytool命令。
keytool.exe -importcert -alias <MySQLCACert> -file <ca.pem> -keystore <truststore_file> -storepass <password>變量 說明 <MySQLCACert> 請設置truststore文件的名稱。建議設置為具有業務意義的名稱,便于后續識別。 <ca.pem> 請替換為下載的CA證書的名稱,ca.pem。 <truststore_file> 請設置truststore文件的存放路徑。 <password > 請設置truststore文件的密碼。 代碼示例(使用JDK安裝路徑下的keytool工具生成truststore文件):
Owner: OID.0.9.2342.19200300.100.1.3=Sample@chinatelecom.cn, CN=ca.ctyun.com, OU=DataBaseGroup, O=CloudCenter, L=GuangZhou, ST=GuangDong, C=CN Issuer: OID.0.9.2342.19200300.100.1.3=Sample@chinatelecom.cn, CN=ca.ctyun.com, OU=DataBaseGroup, O=CloudCenter, L=GuangZhou, ST=GuangDong, C=CN Serial number: b0db70460527a4df Valid from: Tue Mar 21 15:40:12 CST 2023 until: Fri Mar 18 15:40:12 CST 2033 Certificate fingerprints: MD5: A6:9G:E5:5C:10:E4:F4:18:84:66:76:23:54:92:4C:8A SHA1: 23:66:FE:D4:83:24:58:69:B5:F6:28:04:8D:AA:FB:0E:B0:B9:F9:CB SHA256: 3F:C9:C7:EA:3F:8E:9F:6E:71:7E:5C:7A:81:44:0B:EA:51:CB:EA:7F:9C:00:3A:CF:6E:B8:64:9D:16:62:73:91 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: ? ? Trust this certificate? [no]: y ? ? Certificate was added to keystore -
通過JDBC連接MySQL數據庫,代碼中的JDBC鏈接格式如下:
jdbc:mysql://<instance_ip>:<instance_port>/<db_name>? requireSSL=<valuea>&useSSL=<valueb>&verifyServerCertificate=<valuec>&trustCertificateKeyStoreUrl=file: <truststore_file>&trustCertificateKeyStorePassword=<password>參數 說明 <instance_ip> 請替換為實例的IP地址。
說明:如果通過彈性云主機連接,“instance_ip”是實例的“內網地址”。您可以在該實例“基本信息”頁面的“實例信息”區域查看連接地址。如果通過公網連接,“instance_ip”為該實例已綁定的“彈性公網IP”。<instance_port> 請替換為實例的數據庫端口,默認為13049。
說明:您可以在該實例“連接管理”頁面的“連接信息”區域查看。<db_name> 替換為連接實例使用的數據庫名,默認為mysql。 <valuea> requireSSL的值,用于設置服務端是否支持SSL連接。取值如下:true:支持。false:不支持。 <valueb> useSSL的值,用于設置客戶端是否使用SSL連接服務端。取值如下:true:使用。false:不使用。 <valuec> verifyServerCertificate的值,客戶端是否校驗服務端的證書。取值如下:true:校驗。false:不校驗。 <truststore_file> 替換為truststore文件設置的存儲路徑。 <password > 替換為truststore文件設置的密碼。 requireSSL參數應用說明
useSSL requireSSL verifyServerCertificate sslMode false 不涉及 不涉及 DISABLED true false false PREFERRED true true false REQUIRED true 不涉及 true VERIFY_CA 代碼示例(連接MySQL數據庫的java代碼):
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; public class JDBCConnTest { ? public static void main(String[] args) { ? ? ? Connection conn = null; ? ? ? Statement stmt = null; ? ? ? String url = "jdbc:mysql://instance_ip:13049/dbname? requireSSL=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file: <truststore_file>&trustCertificateKeyStorePassword=<password>"? ? ? ? try { ? ? ? ? Class.forName("com.mysql.cj.jdbc.Driver")? ? String USER = "xxx"? ? String PASSOWRD = "xxx"? ? ? ? ? ? conn = DriverManager.getConnection(url, USER, PASSOWRD )? ? ? ? ? ? stmt = conn.createStatement(); ? ? ? ? ? String sql = "show status like 'ssl%'"? ? ? ? ? ? ResultSet rs = stmt.executeQuery(sql); ? ? ? ? ? int columns = rs.getMetaData().getColumnCount()? ? ? ? ? ? for (int i = 1? i <= columns? i++) { ? ? ? ? ? ? System.out.println(rs.getMetaData().getColumnName(i))? ? ? ? ? ? } ? ? ? ? ? while (rs.next()) { ? ? ? ? ? ? ? System.out.println(); ? ? ? ? ? ? ? for (int i = 1? i <= columns? i++) { ? ? ? ? ? ? ? ? ? System.out.println(rs.getObject(i))? ? ? ? ? ? ? ? } ? ? ? ? ? } ? ? ? ? ? rs.close(); ? ? ? ? ? stmt.close(); ? ? ? ? ? conn.close(); ? ? ? } catch (SQLException se) { ? ? ? ? se.printStackTrace(); ? ? ? } catch (Exception e) { ? ? ? ? ? e.printStackTrace()? ? ? ? } finally { ? ? ? ? ? // 釋放資源 ? ? ? } ? } }
無證書連接
說明該方式不對服務端進行證書校驗,用戶無需下載SSL證書。
-
通過JDBC連接MySQL數據庫實例,代碼中的JDBC鏈接格式如下:
jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?useSSL=false變量 說明 <instance_ip> 請替換為實例的IP地址。
說明:如果通過彈性云主機連接,“instance_ip”是實例的“內網地址”。您可以在該實例“基本信息”或“連接管理”頁面的“連接信息”區域查看。如果通過公網連接,“instance_ip”為該實例已綁定的“彈性公網IP”。您可以在該實例“連接管理”頁面的“連接信息”區域查看。<instance_port> 請替換為實例的數據庫端口,默認為13049。
說明:您可以在該實例“連接管理”頁面的“連接信息”區域查看。<database_name> 請替換為連接實例使用的數據庫名,默認為mysql。 代碼示例(連接MySQL數據庫的java代碼):
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class NoneCaConnTest { final public static void main(String[] args) { Connection conn = null; String url = "jdbc:mysql://instance_ip:13049/db_test?useSSL=false"; try { Class.forName("com.mysql.jdbc.Driver"); String USER = "xxx"? ? String PASSOWRD = "xxx"? conn = DriverManager.getConnection(url, USER , PASSOWRD ); System.out.println("Database is connected"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table WHERE column = 100"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("Test no ca failed"); } finally { // 釋放資源 } } }