本文介绍通过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
变量大小)性能最优。