时序数据库QuestDB和TimescaleDB对比

一、springboot项目代码

       (1)QuestdbController:插入数据和查询数据

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    /**
     * @Describe 获取数据库的连接
     * @auther mofei
     * @date 2020年11月3日下午6:25:54
     */
    public static Connection getConnection() throws Exception{
        Properties properties = new Properties();
        properties.setProperty("user", "admin");
        properties.setProperty("password", "quest");
        properties.setProperty("sslmode", "disable");
        properties.setProperty("maxActive", "150");
        //设置连接最大超时时间300s
        properties.setProperty("connectTimeout", "600");
        properties.setProperty("socketTimeout", "600");
        properties.setProperty("rewriteBatchedStatements", "true");

        final Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:8812/qdb", properties);
        connection.setAutoCommit(false);
        return  connection;
    }

    //增删改资源的关闭
    public static void closeReource(Connection con, PreparedStatement ps){
        try {
            if(ps != null)
                ps.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if(con != null)
                con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询资源的关闭
    public static void closeResource(Connection con, PreparedStatement ps, ResultSet rs){
        try {
            if(con != null)
                con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(ps != null)
                ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if(rs != null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public  static  String resultSetToJson(ResultSet rs) throws SQLException
    {
        // json数组
        JSONArray array = new JSONArray();
        // 获取列数
        ResultSetMetaData metaData = rs.getMetaData();
        int columnCount = metaData.getColumnCount();

        // 遍历ResultSet中的每条数据
        while (rs.next()) {
            JSONObject jsonObj = new JSONObject();

            // 遍历每一列
            for (int i = 1; i <= columnCount; i++) {
                String columnName =metaData.getColumnLabel(i);
                String value = rs.getString(columnName);
                jsonObj.put(columnName, value);
            }
            array.add(jsonObj);
        }

        return array.toString();
    }



}
@RequestMapping("/insert/{userid}")
    public void insertData(@PathVariable(name ="userid") String userid) throws Exception {
        System.out.println("开始执行:"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date()));
        long start = System.currentTimeMillis();
        Connection conn= JDBCUtils.getConnection();
        conn.setAutoCommit(false);
        String sql= "insert into tracepoint(tp_guid, pda_id,user_id,x,y,lng,lat,angle,speed,reporttime,type) " +
                "values(?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement ps= conn.prepareStatement(sql);
        for(int i=-480;i<0;i++){
            for(int index = 0; index < 5000; index++) {
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//设置日期格式
                Calendar c = Calendar.getInstance();
                c.add(Calendar.DATE, i);
                Date end = c.getTime();
                String reportTime=df.format(end);
                ps.setString(1, "3");
                ps.setString(2, "C2940FE3AE644CB6A6080D6572EDAEFF");
                ps.setString(3, "S104U6693374828FA3D158B69189F0"+userid);
                ps.setDouble(4, 527768.577594348);
                ps.setDouble(5, 4629185.61306494);
                ps.setDouble(6, 123.33410580);
                ps.setDouble(7, 41.79738038);
                ps.setDouble(8, 73);
                ps.setDouble(9, 6.05581);
                ps.setString(10, reportTime);
                ps.setString(11, "GPS");
                ps.addBatch();
            }
        }
        int[] inserted1 = ps.executeBatch();
        conn.commit();
        JDBCUtils.closeReource(conn,ps);
        long end = System.currentTimeMillis();
        System.out.println("执行结束:"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date()));
        System.out.println("总耗时:" + (end - start) + " ms");
    }

    @RequestMapping("/queryquest")
    public int queryData() throws Exception {
        String res=null;
        long start = System.currentTimeMillis();
        Connection conn= JDBCUtils.getConnection();
            PreparedStatement ps = conn.prepareStatement(" SELECT * from 'tracepoint' where user_id='S104U6693374828FA3D158B69189F018' and reporttime>='2022-03-24' and  reporttime<'2022-03-25';") ;
        ResultSet rs = ps.executeQuery();
        int rowCount = 0;
        while(rs.next()) {
            rowCount++;
        }
        JDBCUtils.closeResource(conn,ps,rs);
        long end = System.currentTimeMillis();
        System.out.println("QuestDb查询结果总行数:"+rowCount+",查询结果总耗时:" + (end - start) + " ms");
//        res=  JDBCUtils.resultSetToJson(rs);
//        JDBCUtils.closeResource(conn,ps,rs);
        return  rowCount;
    }

       (2)TimescaledbController:插入数据和查询数据

import lombok.var;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

@RestController
public class TimeScaleDbController {


    public  static Connection initConn(){
        Connection conn=null;
        String connUrl = "jdbc:postgresql://localhost:5435/example?user=postgres&password=jjgis123.0";
        try {
            conn = DriverManager.getConnection(connUrl);

        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return  conn;
    }

    @RequestMapping("/createschema")
    private static void createSchema() throws SQLException {
        Connection conn=initConn();
        try (var stmt = conn.createStatement()) {
            stmt.execute("CREATE TABLE sensors ( id SERIAL PRIMARY KEY, type TEXT NOT NULL, location TEXT NOT NULL)");
        }

        try (var stmt = conn.createStatement()) {
            stmt.execute("CREATE TABLE sensor_data ( time TIMESTAMPTZ NOT NULL, sensor_id INTEGER REFERENCES sensors (id), value DOUBLE PRECISION)");
        }

        try (var stmt = conn.createStatement()) {
            stmt.execute("SELECT create_hypertable('sensor_data', 'time')");
        }
    }
    @RequestMapping("/insertdata")
    private static void insertData() throws SQLException {
        System.out.println(new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date()));
        for(int i=-480;i<0;i++){
            Connection conn=initConn();
            conn.setAutoCommit(false);
            String sql= "insert into tracepoint(tp_guid, pda_id,user_id,x,y,lng,lat,angle,speed,reporttime,positiontype) values(?,?,?,?,?,?,?,?,?,to_timestamp(?,'yyyy-mm-dd hh24:mi:ss.us'),?)";
            PreparedStatement ps= conn.prepareStatement(sql);
            for(int index = 0; index < 5000; index++) {
                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//设置日期格式
                Calendar c = Calendar.getInstance();
                c.add(Calendar.DATE, i);
                Date end = c.getTime();
                String reportTime=df.format(end);
                ps.setString(1, "3");
                ps.setString(2, "C2940FE3AE644CB6A6080D6572EDAEFF");
                ps.setString(3, "S174U6693374828FA3D158B69189F08E");
                ps.setDouble(4, 527768.577594348);
                ps.setDouble(5, 4629185.61306494);
                ps.setDouble(6, 123.33410580);
                ps.setDouble(7, 41.79738038);
                ps.setDouble(8, 73);
                ps.setDouble(9, 6.05581);
                ps.setString(10, reportTime);
                ps.setString(11, "GPS");
                ps.addBatch();
            }
            int[] inserted1 = ps.executeBatch();
            conn.commit();
            conn.close();
            ps.close();
            System.out.println(new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date()));

        }
        System.out.println("执行结束");
    }

    @RequestMapping("/querytimescale")
    public int queryData() throws Exception {
        String res=null;
        long start = System.currentTimeMillis();
        Connection conn=initConn();
        PreparedStatement ps = conn.prepareStatement(" select * FROM public.tracepoint where user_id='S174U6693374828FA3D158B69189F08E' and reporttime >='2022-03-01'::timestamp and  reporttime <'2022-03-02'::timestamp;") ;
        ResultSet rs = ps.executeQuery();
        int rowCount = 0;
        while(rs.next()) {
            rowCount++;
        }
        conn.close();
        ps.close();
        rs.close();
        long end = System.currentTimeMillis();
        System.out.println("TimescaleDb查询结果总行数:"+rowCount+",查询结果总耗时:" + (end - start) + " ms");
//        res=  JDBCUtils.resultSetToJson(rs);
//        JDBCUtils.closeResource(conn,ps,rs);
        return  rowCount;
    }
}

二、查询对比 测试环境 单机服务器 16g内存 4核cpu ;数据总量2100多万 

查询内容是每人每天的轨迹数(设置的是5000条数据)

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Flink大数据和时序数据库是两个不同的概念和技术。Flink是一个开源的流处理和批处理框架,用于处理大规模的实时和批量数据。它提供了强大的流处理功能,可以处理实时数据流,并支持事件时间和处理时间的窗口操作。Flink可以用于构建实时分析、实时监控和实时报警等应用。 时序数据库(TSDB)是一种专门用于存储和处理时序数据的数据库。时序数据是带有时间戳的数据,常见的应用场景包括监控数据、行驶轨迹、设备传感器等。时序数据库具有高效的数据存储和查询能力,可以支持大规模的时序数据的存储和分析。时序数据库通常采用特定的数据结构和索引方式,以提高时序数据的查询性能和存储效率。 在实际应用中,Flink大数据和时序数据库可以结合使用。Flink可以用于实时处理和分析数据流,而时序数据库可以用于存储和查询大规模的时序数据。通过将Flink与时序数据库集成,可以实现实时数据的处理和存储,并支持复杂的时序数据分析和查询操作。这种组合可以满足对大规模时序数据的实时处理和分析需求。 #### 引用[.reference_title] - *1* *2* *3* [时序数据库](https://blog.csdn.net/xinzhongtianxia/article/details/125607615)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值