Java JDBC(JavaDataBase Connectivity)是一種規範的Java API,主要用於串連和處理資料庫、執行SQL語句。您可以通過Java JDBC介面串連寬表引擎,並結合Lindorm SQL進行應用開發。本文介紹使用MySQL協議,通過Java JDBC介面進行應用開發的方法。
前提條件
已開通MySQL協議相容功能。如何開通,請參見開通MySQL協議相容功能。
已安裝Java環境,要求安裝JDK 1.8及以上版本。
已將用戶端IP添加至白名單,具體操作請參見設定白名單。
操作步驟
添加MySQL JDBC Driver的依賴。以Maven專案為例,在
pom.xml
檔案的dependencies
中添加依賴項。範例程式碼如下:<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
重要推薦通過8.0及以上版本的MySQL JDBC驅動串連Lindorm寬表引擎。
在Java中建立MySQL JDBC串連依賴於MySQL JDBC驅動包,您需要手動將MySQL JDBC驅動包(
mysql-connector-java-x.x.x.jar
)添加至CLASSPATH中,否則無法建立MySQL JDBC串連。
初始化MySQL JDBC用戶端並建立Lindorm用戶端和資料之間的串連。
Class.forName("com.mysql.jdbc.Driver"); //Lindorm控制台擷取的資料庫使用者名稱。 String username = "root"; //Lindorm控制台擷取的資料庫密碼。 String password = "root"; //建立串連時可指定某一database。若不指定database,預設使用default。 String database = "default"; //Lindorm寬表MySQL相容地址。33060是MySQL協議的連接埠號碼。 String url = "jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/" + database + "?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000"; Properties properties = new Properties(); properties.put("user", username); properties.put("password", password); //擷取串連 Connection connection = DriverManager.getConnection(url, properties);
參數說明
參數
說明
url
MySQL協議的Java JDBC串連地址。格式為
jdbc:mysql://<MySQL相容地址>/" + database + "?串連配置
。如何擷取MySQL相容地址,請參見查看串連地址。串連配置的詳細說明,請參見串連配置說明。
重要如果應用部署在ECS執行個體,建議您通過專用網路訪問Lindorm執行個體,可獲得更高的安全性和更低的網路延遲。
如果應用部署在本地,在通過公網串連Lindorm執行個體前需在控制台開通公網地址。開通方式:查看寬表引擎串連地址。
通過專用網路訪問時url請填寫MySQL相容地址對應的專用網路地址,通過公網訪問時url請填寫MySQL相容地址對應的公網地址。
database
需要串連的資料庫名稱。預設串連default資料庫。
username
串連寬表引擎的使用者名稱和密碼。
如果您忘記使用者密碼,可以通過Lindorm寬表引擎的叢集管理系統修改密碼。具體操作,請參見修改使用者密碼。
password
串連配置說明
參數
樣本值
說明
sslMode
disabled
JDBC驅動建立串連時是否使用SSL建立加密串連。建議設定為
disabled
,即不使用SSL建立加密串連。設定為disabled
可以有效提高效能。allowPublicKeyRetrieval
true
JDBC驅動建立串連進行使用者認證時,是否允許從伺服器檢RSA公開金鑰。建議設定為
true
。useServerPrepStmts
true
JDBC驅動是否啟用伺服器端預先處理語句。建議設定為
true
,即允許資料庫使用其內建的SQL預先處理機制,可提高效能並減少SQL注入問題。useLocalSessionState
true
JDBC驅動是否啟用本地工作階段狀態,用於降低對資料庫伺服器的往返通訊次數。建議設定為
true
。rewriteBatchedStatements
true
JDBC驅動是否重寫批量語句。建議設定為
true
,對於使用預先處理語句並進行批量參數綁定的應用,可以極大提升寫入效能。cachePrepStmts
true
是否允許緩衝預先處理語句。建議設定為
true
,可以減少預先處理語句的建立次數,對於頻繁執行的語句有效能提升。prepStmtCacheSize
100
設定JDBC驅動層面緩衝預先處理語句的個數。該參數僅在cachePrepStmts設定為
true
時生效。prepStmtCacheSqlLimit
500000
設定預先處理語句可快取的最大長度,超過此長度的SQL語句不會被緩衝。如果業務對效能比較敏感,建議增加該參數的值。
說明prepStmtCacheSqlLimit值增加可能會消耗更多記憶體資源,建議根據實際需求合理設定。
建立串連後,通過寬表SQL文法使用Lindorm寬表引擎。範例程式碼如下:
String tableName = "sql_table_" + new Random().nextInt(1000); //建立表 try (Statement statement = connection.createStatement()) { String sql = "create table if not exists " + tableName + "(id VARCHAR, name VARCHAR, primary key(id))"; int ret = statement.executeUpdate(sql); System.out.println(ret); } //插入資料 String upsertSql = "insert into " + tableName + "(id,name) values(?,?)"; try (PreparedStatement ps = connection.prepareStatement(upsertSql)) { int batchSize = 100; for (int i = 0; i < batchSize; i++) { ps.setString(1, "aa" + i); ps.setString(2, "bb" + i); //加入批次 ps.addBatch(); } int[] ret = ps.executeBatch(); System.out.println(Arrays.toString(ret)); } //查詢資料 String querySql = "select * from " + tableName + " where id=?"; try (PreparedStatement ps = connection.prepareStatement(querySql)) { ps.setString(1, "aa1"); ResultSet rs = ps.executeQuery(); while (rs.next()) { String id = rs.getString(1); String name = rs.getString(2); System.out.println("id=" + id); System.out.println("name=" + name); } } //刪除資料 String deleteSql = "delete from " + tableName + " where id=?"; try (PreparedStatement ps = connection.prepareStatement(deleteSql)) { ps.setString(1, "aa1"); ps.executeUpdate(); } //關閉串連,當結束操作時要確保串連被關閉,否則會造成串連泄漏。 connection.close();
寬表SQL文法的使用,請參見SQL文法手冊。
說明batchSize為batch的大小,建議不超過
65535/列數
,最佳大小為Math.round(65535/列數)
。例如,上述代碼中樣本表共2列,batch的大小建議不要超過65535/2 = 32767.5
,可以向下取整為32767
。在Lindorm SQL中,
insert
語句的語義與upsert
相同。由於MySQL JDBC的用戶端最佳化了insert
語句,因此在寫入資料時更推薦您使用insert
語句。