ProcessDB实时/时序数据库——JDBC_Prepared查询历史统计数据

目录

前言

一、历史统计数据字段介绍

二、查询历史统计数据


前言

         前文提到了用statement的方式,操作ProcessDB时序数据库,我们实际工作中可能更常使用的是   PreparedStatement方式,优点如下:1、可以防止SQL注入攻击。 2、进行动态查询。3、执行更快。4、简化拼接过程。所以,我在这里着重讲解下如何用PreparedStatement方式,操作ProcessDB实时/时序数据库的历史统计数据


一、历史统计数据字段介绍

CREATE TABLE STAT_TABLE ( 

 ID_F                        INT;//数据点ID,

 NAME_F                      STRING;//数据点名称,

 AVG_F                       DOUBLE;//统计平均值,

 ON_DURATION_F               INT;//持续时间,

 MIN_F                       DOUBLE;//统计最小值,

 TIME_F                      STRING;//数据时间,

 LAST_VAL_F                  DOUBLE;//最后值,

 ULTRA_LIMIT_DURATION_F      INT;//超限制时间,

 INTERVAL_F                  INT;//历史数据时间间隔,

 MAX_F                       DOUBLE;//统计最大值,

 FIRST_VAL_F                 DOUBLE;//第一值,

 LAST_TIME_F                 DATE;//最后时间,

 FIRST_TIME_F                DATE;//第一值时间,

 FLOW_F                      DOUBLE;//流量值,

 COUNT_F                     INT;//统计数据数量,

 ULTRA_LIMIT_COUNT_F         INT;//超限制数量,

 QUALITY_F                   STRING;//数据质量,

 OUTPUT_F                    DOUBLE;//产量

 )

二、查询历史统计数据

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class Test {
	public static void main(String[] args) {
		try {
			Class.forName("com.processdb.jdbc.JDBC");

			Connection connection = null;
			Statement statement = null;
			try {
				// 对数据库进行连接
				connection = DriverManager.getConnection("jdbc:processdb://localhost:8301/instance01", "root", "root");
				statement = connection.createStatement();
				// 设置超时时间
				statement.setQueryTimeout(30); // set timeout to 30 sec.
				ResultSet rs = null;

					// 查询sql
					/**查询统计数据表 STAT_TABLE
					 * 所需字段
					 * interval_f=3600 时间间隔 以秒为单位(不填写默认3600秒)
					 * name_f='public.sys.PDB_OS_CPU_USAGE' 数据点的位置(必填)
					 * time_f>'2022-10-26 00:00:00' and time_f<'2022-10-26 15:35:18'数据时间段(必填)
					 * STAT_BIT_MAP = 1000 统计控制单位 如要查询产量,则值为1000 查询超限为100   若都需要查询多个条件 则值例如为1100(1000+100)
					 * VALUE_F 查询超限时,所需的条件,设置超限界限
					 * ultralimitInterval 查询超限时,所需的条件,设置最短超限时长
					 * 可查询字段
					 * NAME_F 数据点位置
					 * TIME_F 时间
					 * AVG_F 统计平均值
					 * MAX_F 统计最大值
					 * MIN_F 统计最小值
					 * FLOW_F 流量
					 * COUNT_F 统计数据数量
					 * FIRST_VAL_F 第一值
					 * FIRST_TIME_F 第一值时间
					 * LAST_VAL_F 最后值
					 * LAST_TIME_F 最后时间 
					 * OUTPUT_F 产量 
					 * ON_DURATION_F 持续时间
					 * ULTRA_LIMIT_DURATION_F 超限制时间
					 * ULTRA_LIMIT_COUNT_F 超限制数量
					 */
					String sql = "select NAME_F,TIME_F,OUTPUT_F,AVG_F,MAX_F,MIN_F,FLOW_F,COUNT_F,FIRST_VAL_F,FIRST_TIME_F,LAST_VAL_F,LAST_TIME_F,OUTPUT_F,ON_DURATION_F,ULTRA_LIMIT_DURATION_F,ULTRA_LIMIT_COUNT_F  from STAT_TABLE where VALUE_F >? and STAT_BIT_MAP = ? and name_f=? and interval_f = ?  and time_f>? and time_f<? ";
					// 填充sql所需要的参数
					String param1 = "0";
					String param2 = "1000";
					String param3 = "D30.T31.P30";
					String param4 = "300";
					String param5 = "2022-11-10 11:50:00";
					String param6 = "2022-11-10 13:00:00";
					PreparedStatement ps = connection.prepareStatement(sql);
					ps.setString(1, param1);
					ps.setString(2, param2);
					ps.setString(3, param3);
					ps.setString(4, param4);
					ps.setString(5, param5);
					ps.setString(6, param6);

					// 运行sql发起请求
					rs = ps.executeQuery();
					// 查询结果存储在ResultSet
					System.out.println("Query statdata from table: stat_table.");
					while (rs.next()) {
						// read the result set
						System.out.println("NAME_F:" + rs.getString("NAME_F")+",TIME_F:"+rs.getString("TIME_F")+",AVG_F:"+rs.getString("AVG_F")+",MAX_F:"+rs.getString("MAX_F")+",MIN_F:"+rs.getString("MIN_F")+",FLOW_F:"+rs.getString("FLOW_F")
						+",COUNT_F:"+rs.getString("COUNT_F")+",FIRST_VAL_F:"+rs.getFloat("FIRST_VAL_F")+",FIRST_TIME_F:"+rs.getTime("FIRST_TIME_F")+",LAST_VAL_F:"+rs.getFloat("LAST_VAL_F")+",LAST_TIME_F:"+rs.getTime("LAST_TIME_F")
						+",OUTPUT_F:"+rs.getString("OUTPUT_F")+",ON_DURATION_F:"+rs.getFloat("ON_DURATION_F")+",ULTRA_LIMIT_DURATION_F:"+rs.getFloat("ULTRA_LIMIT_DURATION_F")+",ULTRA_LIMIT_COUNT_F:"+rs.getFloat("ULTRA_LIMIT_COUNT_F"));	}
					System.out.println("Count: " + rs.getRow());

			} catch (SQLException e) {
				System.err.println(e.getMessage());
				e.printStackTrace();
			} finally {
				try {

					if (statement != null) {
						statement.close();
					}
					if (connection != null) {
						connection.close();
					}
				} catch (SQLException e) {
					System.err.println(e);
				}
			}
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
			return;
		}
		return;
	}
}

示例运行如下:

Query statdata from table: stat_table.
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:00:00.0,AVG_F:81.85714285714286,MAX_F:98.0,MIN_F:57.0,FLOW_F:573.0,COUNT_F:7,FIRST_VAL_F:57.0,FIRST_TIME_F:11:33:47,LAST_VAL_F:98.0,LAST_TIME_F:12:04:59,OUTPUT_F:42.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:05:00.0,AVG_F:49.33779264214047,MAX_F:99.0,MIN_F:0.0,FLOW_F:14752.0,COUNT_F:299,FIRST_VAL_F:99.0,FIRST_TIME_F:12:05:00,LAST_VAL_F:97.0,LAST_TIME_F:12:09:59,OUTPUT_F:296.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:10:00.0,AVG_F:49.18456375838926,MAX_F:99.0,MIN_F:0.0,FLOW_F:14657.0,COUNT_F:298,FIRST_VAL_F:98.0,FIRST_TIME_F:12:10:00,LAST_VAL_F:95.0,LAST_TIME_F:12:14:59,OUTPUT_F:295.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:15:00.0,AVG_F:49.34782608695652,MAX_F:99.0,MIN_F:0.0,FLOW_F:14755.0,COUNT_F:299,FIRST_VAL_F:96.0,FIRST_TIME_F:12:15:00,LAST_VAL_F:94.0,LAST_TIME_F:12:19:59,OUTPUT_F:296.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:20:00.0,AVG_F:49.20469798657718,MAX_F:99.0,MIN_F:0.0,FLOW_F:14663.0,COUNT_F:298,FIRST_VAL_F:95.0,FIRST_TIME_F:12:20:00,LAST_VAL_F:92.0,LAST_TIME_F:12:24:59,OUTPUT_F:295.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:25:00.0,AVG_F:49.08080808080808,MAX_F:99.0,MIN_F:0.0,FLOW_F:14577.0,COUNT_F:297,FIRST_VAL_F:93.0,FIRST_TIME_F:12:25:00,LAST_VAL_F:89.0,LAST_TIME_F:12:29:59,OUTPUT_F:294.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:30:00.0,AVG_F:49.238255033557046,MAX_F:99.0,MIN_F:0.0,FLOW_F:14673.0,COUNT_F:298,FIRST_VAL_F:90.0,FIRST_TIME_F:12:30:00,LAST_VAL_F:87.0,LAST_TIME_F:12:34:59,OUTPUT_F:295.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:35:00.0,AVG_F:49.13131313131313,MAX_F:99.0,MIN_F:0.0,FLOW_F:14592.0,COUNT_F:297,FIRST_VAL_F:88.0,FIRST_TIME_F:12:35:00,LAST_VAL_F:84.0,LAST_TIME_F:12:39:59,OUTPUT_F:294.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:40:00.0,AVG_F:49.27181208053691,MAX_F:99.0,MIN_F:0.0,FLOW_F:14683.0,COUNT_F:298,FIRST_VAL_F:85.0,FIRST_TIME_F:12:40:00,LAST_VAL_F:82.0,LAST_TIME_F:12:44:59,OUTPUT_F:295.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:45:00.0,AVG_F:49.18181818181818,MAX_F:99.0,MIN_F:0.0,FLOW_F:14607.0,COUNT_F:297,FIRST_VAL_F:83.0,FIRST_TIME_F:12:45:00,LAST_VAL_F:79.0,LAST_TIME_F:12:49:59,OUTPUT_F:294.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:50:00.0,AVG_F:49.21212121212121,MAX_F:99.0,MIN_F:0.0,FLOW_F:14616.0,COUNT_F:297,FIRST_VAL_F:80.0,FIRST_TIME_F:12:50:00,LAST_VAL_F:76.0,LAST_TIME_F:12:54:59,OUTPUT_F:294.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
NAME_F:D30.T31.P30,TIME_F:2022-11-10 12:55:00.0,AVG_F:49.16216216216216,MAX_F:99.0,MIN_F:0.0,FLOW_F:14552.0,COUNT_F:296,FIRST_VAL_F:77.0,FIRST_TIME_F:12:55:00,LAST_VAL_F:72.0,LAST_TIME_F:12:59:59,OUTPUT_F:292.0,ON_DURATION_F:300.0,ULTRA_LIMIT_DURATION_F:0.0,ULTRA_LIMIT_COUNT_F:0.0
Count: 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值