JAVA接入IOTDB
文章目录
前提JDK >= 1.8 Maven >= 3.6
安装
maven中加入依赖
<dependencies>
<dependency>
<groupId>org.apache.iotdb</groupId>
<artifactId>iotdb-session</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
语法说明
对于 IoTDB-SQL 接口:传入的 SQL 参数需要符合 语法规范 ,并且针对 JAVA 字符串进行反转义,如双引号前需要加反斜杠。(即:经 JAVA 转义之后与命令行执行的 SQL 语句一致。)
对于其他接口:
– 经参数传入的路径或路径前缀中的节点: 在 SQL 语句中需要使用反引号()进行转义的,此处均需要进行转义。 - 经参数传入的标识符(如模板名):在 SQL 语句中需要使用反引号(
)进行转义的,均可以不用进行转义。
语法详细说明可以参考官方文档语法使用
基本接口说明
初始化session
// 全部使用默认配置
session = new Session.Builder.build();
// 指定一个可连接节点
session =
new Session.Builder()
.host(String host)
.port(int port)
.build();
// 指定多个可连接节点
session =
new Session.Builder()
.nodeUrls(List<String> nodeUrls)
.build();
// 其他配置项
session =
new Session.Builder()
.fetchSize(int fetchSize)
.username(String username)
.password(String password)
.thriftDefaultBufferSize(int thriftDefaultBufferSize)
.thriftMaxFrameSize(int thriftMaxFrameSize)
.enableRedirection(boolean enableRedirection)
.version(Version version)
.build();
开启session
void open()
关闭session
void close()
数据定义接口DDL和插入数据简单例子
设置数据库
void setStorageGroup(String storageGroupId)
删除单个或多个数据库
void deleteStorageGroup(String storageGroup)
void deleteStorageGroups(List<String> storageGroups)
创建单个或多个时间序列
void createTimeseries(String path, TSDataType dataType,
TSEncoding encoding, CompressionType compressor, Map<String, String> props,
Map<String, String> tags, Map<String, String> attributes, String measurementAlias)
void createMultiTimeseries(List<String> paths, List<TSDataType> dataTypes,
List<TSEncoding> encodings, List<CompressionType> compressors,
List<Map<String, String>> propsList, List<Map<String, String>> tagsList,
List<Map<String, String>> attributesList, List<String> measurementAliasList)
创建对齐时间序列
void createAlignedTimeseries(String prefixPath, List<String> measurements,
List<TSDataType> dataTypes, List<TSEncoding> encodings,
List <CompressionType> compressors, List<String> measurementAliasList);
删除一个或多个时间序列
void deleteTimeseries(String path)
void deleteTimeseries(List<String> paths)
检测时间序列是否存在
boolean checkTimeseriesExists(String path)
创建数据直接插入数据库
// 设置表结构
List<MeasurementSchema> schemaList = new ArrayList<>();
schemaList.add(new MeasurementSchema("字段值1", TSDataType.DOUBLE));
schemaList.add(new MeasurementSchema("字段值2", TSDataType.INT32));
schemaList.add(new MeasurementSchema("字段值3", TSDataType.TEXT));
// 创建路径
String iotdbPath = "root.db.xx.yy";
String value1 = "值1";
String value2 = "值2";
String value3 = "值3";
Map<String, Tablet> tabletsMap=new HashMap<>();
// 路径 表结构 每次插入最大量 maxNum = 1000
Tablet tablet new Tablet(iotdbPath, schemaList, maxNum);
int rowIndex = tablet.rowSize++;
tablet.addTimestamp(rowIndex, offset);
tablet.addValue(schemaList.get(0).getMeasurementId(), rowIndex, Convert.toDouble(value1));
tablet.addValue(schemaList.get(1).getMeasurementId(), rowIndex, value2);
tablet.addValue(schemaList.get(2).getMeasurementId(), rowIndex, value3);
tabletsMap.put(iotdbPath,tablet);
// 创建
iotDbUtil.pool.insertTablets(tabletsMap,true);
关于IOTDB连接,查询,写个工具类统一管理、处理。当然可能有更优解。眼下还没来得及学习。
针对原生接口的链接池
官方提供了一个针对原生接口的连接池 (SessionPool),使用该接口时,你只需要指定连接池的大小,就可以在使用时从池中获取连接。
如果超过 60s 都没得到一个连接的话,那么会打印一条警告日志,但是程序仍将继续等待。
当一个连接被用完后,他会自动返回池中等待下次被使用;
当一个连接损坏后,他会从池中被删除,并重建一个连接重新执行用户的操作;
你还可以像创建 Session 那样在创建 SessionPool 时指定多个可连接节点的 url,以保证分布式集群中客户端的高可用性。
对于查询操作:
使用 SessionPool 进行查询时,得到的结果集是SessionDataSet的封装类SessionDataSetWrapper;
若对于一个查询的结果集,用户并没有遍历完且不再想继续遍历时,需要手动调用释放连接的操作closeResultSet;
若对一个查询的结果集遍历时出现异常,也需要手动调用释放连接的操作closeResultSet.
可以调用 SessionDataSetWrapper 的 getColumnNames() 方法得到结果集列名
作者:wangyanfei2021