Apache IoTDB 的客户端接口
1、JDBC接口
-
首先导入你对应iotdb版本的pom依赖:
<dependencies> <dependency> <groupId>org.apache.iotdb</groupId> <artifactId>iotdb-jdbc</artifactId> <version>0.12.3</version> </dependency> </dependencies>
-
编写对应的代码
import com.mysql.jdbc.StringUtils; import java.sql.*; public class IoTDBJDBC { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 加载类库 Class.forName("org.apache.iotdb.jdbc.IoTDBDriver"); // 建立连接 try (Connection connection = DriverManager.getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root"); Statement statement = connection.createStatement()) { // 创建存储组 statement.execute("SET STORAGE GROUP TO root.sg1"); // 创建时间序列 statement.execute("CREATE TIMESERIES root.sg1.d1.s1 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY"); statement.execute("CREATE TIMESERIES root.sg1.d1.s2 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY"); statement.execute("CREATE TIMESERIES root.sg1.d1.s3 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY"); // 在客户端积累一批更新语句 for (int i = 0; i < 100; i++) { statement.addBatch("insert into root.sg1.d1(timestamp, s1, s2, s3) values("+ i + "," + 1 + "," + 1 + "," + 1 + ")"); } // 执行 statement.executeBatch(); statement.clearBatch(); // 查询 ResultSet resultSet = statement.executeQuery("select * from root where time < 10"); // 打印结果集 ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); while (resultSet.next()) { for (int i = 1; i < columnCount; i++) { resultSet.getString(i); System.out.println(" "); } System.out.println(); } } } }
-
结果
查询结果
2、Java原生接口Session
对于数据的写入,SQL解析就占了70%耗时,然后我们就提供了一个NoSQL接口(Session),相比于JDBC更高效。
-
首先对应的包
<dependencies> <dependency> <groupId>org.apache.iotdb</groupId> <artifactId>iotdb-session</artifactId> <version>0.12.3</version> </dependency> </dependencies>
-
然后编写对应的代码(这里需要注意设置的存储组不能为已经有的存储组,不然会出错,可以用show storage group 先看一下自己有哪些存储组,避免冲突)
package utils; import org.apache.iotdb.session.Session; import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding; import java.util.ArrayList; import java.util.List; public class IoTDBSession { public static void main(String[] args) throws Exception{ // 初始化Session Session session = new Session("127.0.0.1",6667,"root","root"); // 开启Session session.open(); // 设置存储组--这里注意不能设置已经存在的存储组,不然会爆出异常 300: xxxx.xx has already been set to storage group session.setStorageGroup("root.test"); session.createTimeseries("root.test.wf01.wt01.s0", TSDataType.INT32, TSEncoding.RLE, CompressionType.SNAPPY); session.createTimeseries("root.test.wf01.wt01.s1", TSDataType.INT32, TSEncoding.RLE, CompressionType.SNAPPY); session.createTimeseries("root.test.wf01.wt01.s2", TSDataType.INT32, TSEncoding.RLE, CompressionType.SNAPPY); // 在这里可以选择已经存在的设备,可以通过show devices来查看自己的设备 String deviceId = "root.ln.wf01.wt01"; List<String> measurements = new ArrayList<>(16); measurements.add("s0"); measurements.add("s1"); measurements.add("s2"); for (int i = 1000; i < 5000; i++) { List<Object> values = new ArrayList<>(3); List<TSDataType> types = new ArrayList<>(3); values.add(1); types.add(TSDataType.INT32); values.add(2); types.add(TSDataType.INT32); values.add(3); types.add(TSDataType.INT32); // 插入多个记录,在这里提供了数据类型,服务器不需要做类型推断,可以提高性能 session.insertRecord(deviceId, i, measurements, types, values); } session.close(); } }
-
结果
3、SessionPool
连接池的接口和 Session 基本一样,但是连接池可以供多线程使用,而且可以屏蔽连接异常等问题。
初始化:
SessionPool sessionPool = new SessionPool("127.0.0.1", 6667, "root", "root", 3, false);
3指的是maxSize
false 是 enableCompression
插入:
sessionPool.insertRecord(deviceId, i, measurements, types, values);
其他与session处理一样
查询:
使用连接池唯一一点需要注意的是,查询得到的结果集使用完需要返还给连接池(调用连接池的 closeResultSet 方法),不然连接会被占用,无法得到新的连接就报超时了。
package utils;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.session.pool.SessionDataSetWrapper;
import org.apache.iotdb.session.pool.SessionPool;
public class IoTDBSessionPool {
public static void main(String[] args){
SessionPool sessionPool = new SessionPool("127.0.0.1", 6667, "root", "root", 3, false);
SessionDataSetWrapper wrapper = null;
try {
wrapper = sessionPool.executeQueryStatement("select s4 from root.test.wf01.wt01");
for (String columnName : wrapper.getColumnNames()) {
System.out.println(columnName);
}
while (wrapper.hasNext()) {
System.out.println(wrapper.next() + "------->");
}
} catch (IoTDBConnectionException | StatementExecutionException e) {
e.printStackTrace();
} finally {
sessionPool.closeResultSet(wrapper);
}
}
}
结果:
这里主要是先为了测试接口,更多方法的详细使用,在官网:https://iotdb.apache.org/zh/UserGuide/V0.12.x/API/Programming-Native-API.html