InfluxDB和IotDB介绍与性能比照
Linux MacBook Docker装置IoTDB及应用
形式一: session形式拜访IotDB (举荐应用,自带连接池)
maven依赖iotdb-session
<dependency> <groupId>org.apache.iotdb</groupId> <artifactId>iotdb-session</artifactId> <version>0.11.2</version></dependency>
springboot IotDB配置信息session形式
spring: iotdb: username: root password: root ip: 192.168.0.5 port: 6667 maxSize: 100
IotDB-session配置类
package com.beyond.data.config;import org.apache.iotdb.session.pool.SessionPool;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component;import java.util.List;@Component@Configurationpublic class IotDBSessionConfig { private static final Logger log = LoggerFactory.getLogger(IotDBSessionConfig.class); @Value("${spring.iotdb.username:root}") private String username; @Value("${spring.iotdb.password:root}") private String password; @Value("${spring.iotdb.ip:127.0.0.1}") private String ip; @Value("${spring.iotdb.port:6667}") private int port; @Value("${spring.iotdb.maxSize:10}") private int maxSize; private static SessionPool sessionPool; private SessionPool getSessionPool() { if (sessionPool == null) { sessionPool = new SessionPool(ip, port, username, password, maxSize); } return sessionPool; } public void insertRecord(String deviceId, long time, List<String> measurements, List<String> values) { getSessionPool(); try { log.info("iotdb数据入库:device_id:[{}], measurements:[{}], values:[{}]", deviceId, measurements, values); sessionPool.insertRecord(deviceId, time, measurements, values); } catch (Exception e) { log.error("IotDBSession insertRecord失败: deviceId={}, time={}, measurements={}, values={}, error={}", deviceId, time, measurements, values, e.getMessage()); } }}
调用session形式
@Autowiredprivate IotDBSessionConfig iotDBSessionConfig;......StringBuffer tableName = new StringBuffer();tableName.append("root").append(".").append("test").append("deviceid");long currentTime = System.currentTimeMillis();List<String> iotMeasurements = new ArrayList<>();iotMeasurements.add("aaa");iotMeasurements.add("bbb");List<String> iotValues = new ArrayList<>();iotValues.add("123");iotValues.add("abide");iotDBSessionConfig.insertRecord(tableName.toString(), currentTime, iotMeasurements, iotValues);
形式二: jdbc形式拜访IotDB (本人实现连接池)
maven依赖iotdb-jdbc
<dependency> <groupId>org.apache.iotdb</groupId> <artifactId>iotdb-jdbc</artifactId> <version>0.11.2</version></dependency> <!-- alibaba的druid数据库连接池 --><dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId></dependency>
spring boot IotDB配置信息jdbc
spring: iotdb: username: root password: root driver-name: org.apache.iotdb.jdbc.IoTDBDriver url: jdbc:iotdb://192.168.0.5:6667/ initial-size: 5 min-idle: 10 max-active: 50 max-wait: 60000 remove-abandoned: true remove-abandoned-timeout: 30 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 test-while-idle: false test-on-borrow: false test-on-return: false
IotDB-jdbc配置类
package com.beyond.data.config;import com.alibaba.druid.pool.DruidDataSource;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component;import java.sql.*;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@Component@Configurationpublic class IotDBConfig { private static final Logger log = LoggerFactory.getLogger(IotDBConfig.class); @Value("${spring.iotdb.username}") private String username; @Value("${spring.iotdb.password}") private String password; @Value("${spring.iotdb.driver-name}") private String driverName; @Value("${spring.iotdb.url}") private String url; @Value("${spring.iotdb.initial-size:20}") private int initialSize; @Value("${spring.iotdb.min-idle:10}") private int minIdle; @Value("${spring.iotdb.max-active:500}") private int maxActive; @Value("${spring.iotdb.max-wait:60000}") private int maxWait; @Value("${spring.iotdb.remove-abandoned:true}") private boolean removeAbandoned; @Value("${spring.iotdb.remove-abandoned-timeout:30}") private int removeAbandonedTimeout; @Value("${spring.iotdb.time-between-eviction-runs-millis:60000}") private int timeBetweenEvictionRunsMillis; @Value("${spring.iotdb.min-evictable-idle-time-millis:300000}") private int minEvictableIdleTimeMillis; @Value("${spring.iotdb.test-while-idle:false}") private boolean testWhileIdle; @Value("${spring.iotdb.test-on-borrow:false}") private boolean testOnBorrow; @Value("${spring.iotdb.test-on-return:false}") private boolean testOnReturn; private static DruidDataSource iotDbDataSource; //应用阿里的druid连接池 private Connection getConnection() { if (iotDbDataSource == null) { iotDbDataSource = new DruidDataSource(); //设置连贯参数 iotDbDataSource.setUrl(url); iotDbDataSource.setDriverClassName(driverName); iotDbDataSource.setUsername(username); iotDbDataSource.setPassword(password); //配置初始化大小、最小、最大 iotDbDataSource.setInitialSize(initialSize); iotDbDataSource.setMinIdle(minIdle); iotDbDataSource.setMaxActive(maxActive); //配置获取连贯期待超时的工夫 iotDbDataSource.setMaxWait(maxWait); //连贯透露监测 iotDbDataSource.setRemoveAbandoned(removeAbandoned); iotDbDataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout); //配置距离多久才进行一次检测,检测须要敞开的闲暇连贯,单位是毫秒 iotDbDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); iotDbDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); //避免过期 iotDbDataSource.setTestWhileIdle(testWhileIdle); iotDbDataSource.setTestOnBorrow(testOnBorrow); iotDbDataSource.setTestOnReturn(testOnReturn); } Connection connection = null; try { connection = iotDbDataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); log.error("iotDB getConnection失败: error={}", e.getMessage()); } return connection; } public void insert(String sql) { log.info("iotDB insert sql={}", sql); Connection connection = getConnection(); Statement statement = null; try { if(connection!=null){ statement = connection.createStatement(); long systemTime = System.currentTimeMillis(); statement.execute(sql); log.info("执行IotDb的sql----[{}],工夫:[{}]ms", sql, System.currentTimeMillis()-systemTime); } } catch (SQLException e) { log.error("iotDB insert失败: error={}", e.getMessage()); } finally { close(statement, connection); } } public List<Map<String, Object>> query(String sql) { Connection connection = getConnection(); Statement statement = null; List<Map<String, Object>> resultList = null; ResultSet resultSet = null; try { if(connection!=null){ statement = connection.createStatement(); long systemTime = System.currentTimeMillis(); resultSet = statement.executeQuery(sql); log.info("查问IotDb的sql----[{}],工夫:[{}]ms", sql,System.currentTimeMillis()-systemTime); resultList = outputResult(resultSet); } } catch (SQLException e) { e.printStackTrace(); log.error("iotDB query失败: error={}", e.getMessage()); } finally { try { if (resultSet != null) { resultSet.close(); } } catch (SQLException e) { log.error("iotDB resultSet敞开异样: error={}", e.getMessage()); } close(statement, connection); } return resultList; } private List<Map<String, Object>> outputResult(ResultSet resultSet) throws SQLException { List<Map<String, Object>> resultList = new ArrayList<>(); if (resultSet != null) { ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); while (resultSet.next()) { Map resultMap = new HashMap<>(); for (int i = 1; i <= columnCount; i++) { String colunmName = metaData.getColumnLabel(i); if (colunmName.indexOf('.')>=0) { colunmName = colunmName.substring(colunmName.lastIndexOf('.') + 1); } if (colunmName.indexOf(')')>=0){//过滤 函数()括号 colunmName = colunmName.substring(0, colunmName.lastIndexOf(')')); } if (colunmName.equals("Time")){//时序库自带的工夫格局转换 Long timeStamp = Long.parseLong(resultSet.getString(i)); if(timeStamp > 0) { Date d = new Date(timeStamp); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); resultMap.put("Time", sf.format(d)); } } else { resultMap.put(colunmName, resultSet.getString(i)); } } resultList.add(resultMap); } } return resultList; } private void close(Statement statement, Connection connection) { try { if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (Exception e) {// e.printStackTrace(); log.error("iotDB close失败: error={}", e.getMessage()); } }}
调用jdbc形式
@Autowiredprivate IotDBConfig iotDBConfig;......StringBuffer tableName = new StringBuffer();tableName.append("root").append(".").append("test").append("deviceid");long currentTime = System.currentTimeMillis();List<String> iotMeasurements = new ArrayList<>();iotMeasurements.add("aaa");iotMeasurements.add("bbb");List<String> iotValues = new ArrayList<>();iotValues.add("123");iotValues.add("abde");StringBuffer sql = new StringBuffer();sql.append(" insert into ").append(tableName.toString());sql.append("(timestamp,");sql.append(String.join( ",", iotMeasurements)).append(")");sql.append(" values(").append(currentTime).append(",");sql.append(String.join(",", iotValues)).append(")");iotDBConfig.insert(sql.toString());//查问StringBuffer querySql = new StringBuffer();querySql.append(" select ").append("aaa");querySql.append(" from ").append(tableName.toString());querySql.append(" where ").append("bbb").append(" = '");querySql.append("abde").append("'");querySql.append(" order by time desc limit 1 ");log.info("sql----{}", querySql);List<Map<String, Object>> resultList = iotDBConfig.query(querySql.toString());