全部產品
Search
文件中心

Lindorm:如何高效地寫入資料

更新時間:Jul 06, 2024

本文介紹通過JDBC向時序引擎中寫入資料的方法。

基於JDBC開發高效資料寫入的應用

對於使用JDBC進行應用開發的情境,為了達到高效資料寫入的目的,推薦使用JDBC中的PreparedStatement實現INSERT語句的批量寫入。具體步驟如下:

  1. 使用JDBC建立Connection對象。

    通過JDBC建立串連的方法,詳細可參見通過JDBC Driver串連使用(推薦)

  2. 建立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());
  3. 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變數大小)效能最優。