本文介紹通過JDBC向時序引擎中寫入資料的方法。
基於JDBC開發高效資料寫入的應用
對於使用JDBC進行應用開發的情境,為了達到高效資料寫入的目的,推薦使用JDBC中的PreparedStatement
實現INSERT語句的批量寫入。具體步驟如下:
使用JDBC建立
Connection
對象。通過JDBC建立串連的方法,詳細可參見通過JDBC Driver串連使用(推薦)。
建立
PreparedStatement
對象並指定帶參數的INSERT語句。以"如何為時序資料建表"章節中介紹的樣本為基礎,建立
PreparedStatement
的方法如下所示:StringBuilder builder = new StringBuilder(); builder.append("INSERT INTO aqm (city, district, id, time, pm2_5, pm10, so2, no2) "); builder.append("VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); PreparedStatement preparedStmt = connection.prepareStatement(builder.toString());
對
PreparedStatement
對象進行批量的輸入參數綁定,並實際執行寫入。對於上一步的INSERT語句,綁參的範例程式碼如下:
for (int i = 0; i < batchSize; i++) { // 按INSERT語句中的列參數指定順序依次綁參 // 下述代碼中的 city, district, id, ts, pm25等都是用於綁參的局部變數 preparedStmt.setString(1, city); preparedStmt.setString(2, district); preparedStmt.setString(3, id); preparedStmt.setTimestamp(4, ts); preparedStmt.setDouble(5, pm25); preparedStmt.setDouble(6, pm10); preparedStmt.setDouble(7, so2); preparedStmt.setDouble(8, no2); // 加入批次 preparedStmt.addBatch(); } // 執行一個批次的寫入 int[] results = preparedStmt.executeBatch(); // 從results中查詢實際寫入的資料記錄數。以下略 }
說明
時序引擎的JDBC中的
PreparedStatement
只支援無具名引數(即通過預留位置“?”指定參數),因此在實際調用PreparedStatement
的綁參API時,需要確保setXXX()
方法中指定的參數index所對應的參數值與INSERT語句中預留位置所對應列一致。PreparedStatement
在執行executeBatch()
前綁定的參數批次並不是越多越好,其效能表現往往與表定義相關。根據實際測試的結果,如果表定義中僅有1個Field,並且TAG列的個數不超過5個時,PreparedStatement
執行的一個批次的個數為5000(即上述程式碼範例中的batchSize
變數大小)效能最優。