# Apache IoTDB(0.12.x) 的客户端接口的使用与学习

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值