基于Java JDBC接口的應(yīng)用開發(fā)
Java JDBC(JavaDataBase Connectivity)是一種規(guī)范的Java API,主要用于連接和處理數(shù)據(jù)庫、執(zhí)行SQL語句。您可以通過Java JDBC接口連接寬表引擎,并結(jié)合Lindorm SQL進(jìn)行應(yīng)用開發(fā)。本文介紹使用MySQL協(xié)議,通過Java JDBC接口進(jìn)行應(yīng)用開發(fā)的方法。
前提條件
已開通MySQL協(xié)議兼容功能。如何開通,請參見開通MySQL協(xié)議兼容功能。
已安裝Java環(huán)境,要求安裝JDK 1.8及以上版本。
已將客戶端IP添加至白名單,具體操作請參見設(shè)置白名單。
操作步驟
添加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驅(qū)動連接Lindorm寬表引擎。
在Java中創(chuàng)建MySQL JDBC連接依賴于MySQL JDBC驅(qū)動包,您需要手動將MySQL JDBC驅(qū)動包(
mysql-connector-java-x.x.x.jar
)添加至CLASSPATH中,否則無法創(chuàng)建MySQL JDBC連接。
初始化MySQL JDBC客戶端并建立Lindorm客戶端和數(shù)據(jù)之間的連接。
Class.forName("com.mysql.jdbc.Driver"); //Lindorm控制臺獲取的數(shù)據(jù)庫用戶名。 String username = "root"; //Lindorm控制臺獲取的數(shù)據(jù)庫密碼。 String password = "root"; //建立連接時可指定某一database。若不指定database,默認(rèn)使用default。 String database = "default"; //Lindorm寬表MySQL兼容地址。33060是MySQL協(xié)議的端口號。 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);
參數(shù)說明
參數(shù)
說明
url
MySQL協(xié)議的Java JDBC連接地址。格式為
jdbc:mysql://<MySQL兼容地址>/" + database + "?連接配置
。如何獲取MySQL兼容地址,請參見查看連接地址。連接配置的詳細(xì)說明,請參見連接配置說明。
重要如果應(yīng)用部署在ECS實例,建議您通過專有網(wǎng)絡(luò)訪問Lindorm實例,可獲得更高的安全性和更低的網(wǎng)絡(luò)延遲。
如果應(yīng)用部署在本地,在通過公網(wǎng)連接Lindorm實例前需在控制臺開通公網(wǎng)地址。開通方式:查看寬表引擎連接地址。
通過專有網(wǎng)絡(luò)訪問時url請?zhí)顚慚ySQL兼容地址對應(yīng)的專有網(wǎng)絡(luò)地址,通過公網(wǎng)訪問時url請?zhí)顚慚ySQL兼容地址對應(yīng)的公網(wǎng)地址。
database
需要連接的數(shù)據(jù)庫名稱。默認(rèn)連接default數(shù)據(jù)庫。
username
連接寬表引擎的用戶名和密碼。
如果您忘記用戶密碼,可以通過Lindorm寬表引擎的集群管理系統(tǒng)修改密碼。具體操作,請參見修改用戶密碼。
password
連接配置說明
參數(shù)
示例值
說明
sslMode
disabled
JDBC驅(qū)動建立連接時是否使用SSL建立加密連接。建議設(shè)置為
disabled
,即不使用SSL建立加密連接。設(shè)置為disabled
可以有效提高性能。allowPublicKeyRetrieval
true
JDBC驅(qū)動建立連接進(jìn)行用戶認(rèn)證時,是否允許從服務(wù)器檢RSA公鑰。建議設(shè)置為
true
。useServerPrepStmts
true
JDBC驅(qū)動是否啟用服務(wù)器端預(yù)處理語句。建議設(shè)置為
true
,即允許數(shù)據(jù)庫使用其內(nèi)置的SQL預(yù)處理機制,可提高性能并減少SQL注入問題。useLocalSessionState
true
JDBC驅(qū)動是否啟用本地會話狀態(tài),用于降低對數(shù)據(jù)庫服務(wù)器的往返通信次數(shù)。建議設(shè)置為
true
。rewriteBatchedStatements
true
JDBC驅(qū)動是否重寫批量語句。建議設(shè)置為
true
,對于使用預(yù)處理語句并進(jìn)行批量參數(shù)綁定的應(yīng)用,可以極大提升寫入性能。cachePrepStmts
true
是否允許緩存預(yù)處理語句。建議設(shè)置為
true
,可以減少預(yù)處理語句的創(chuàng)建次數(shù),對于頻繁執(zhí)行的語句有性能提升。prepStmtCacheSize
100
設(shè)置JDBC驅(qū)動層面緩存預(yù)處理語句的個數(shù)。該參數(shù)僅在cachePrepStmts設(shè)置為
true
時生效。prepStmtCacheSqlLimit
500000
設(shè)置預(yù)處理語句可緩存的最大長度,超過此長度的SQL語句不會被緩存。如果業(yè)務(wù)對性能比較敏感,建議增加該參數(shù)的值。
說明prepStmtCacheSqlLimit值增加可能會消耗更多內(nèi)存資源,建議根據(jù)實際需求合理設(shè)置。
建立連接后,通過寬表SQL語法使用Lindorm寬表引擎。示例代碼如下:
String tableName = "sql_table_" + new Random().nextInt(1000); //創(chuàng)建表 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); } //插入數(shù)據(jù) 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)); } //查詢數(shù)據(jù) 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); } } //刪除數(shù)據(jù) String deleteSql = "delete from " + tableName + " where id=?"; try (PreparedStatement ps = connection.prepareStatement(deleteSql)) { ps.setString(1, "aa1"); ps.executeUpdate(); } //關(guān)閉連接,當(dāng)結(jié)束操作時要確保連接被關(guān)閉,否則會造成連接泄漏。 connection.close();
寬表SQL語法的使用,請參見SQL語法手冊。
說明batchSize為batch的大小,建議不超過
65535/列數(shù)
,最佳大小為Math.round(65535/列數(shù))
。例如,上述代碼中示例表共2列,batch的大小建議不要超過65535/2 = 32767.5
,可以向下取整為32767
。在Lindorm SQL中,
insert
語句的語義與upsert
相同。由于MySQL JDBC的客戶端優(yōu)化了insert
語句,因此在寫入數(shù)據(jù)時更推薦您使用insert
語句。