본문으로 건너뛰기

TQL 과 JDBC 드라이버

시계열 엔진(TSE)에 밖에서 질의를 넣는 두 가지 길입니다 — 질의 언어는 TQL, 접속 수단은 JDBC 드라이버입니다.

한 줄 요약
드라이버 plantpulse.timeseries.tql.TQLDriver
URL jdbc:ts://<호스트>:7800
계정 tse / (설치가 정한 비밀번호)

TQL 은 넷 중 하나입니다​

데이터 게이트웨이(:5500)는 질의 언어로 백엔드를 고릅니다. 어느 엔진에 붙는지 몰라도 되도록 만든 구조이고, TQL 이 시계열 엔진 담당입니다.

언어뒷단무엇에 쓰나
PQLPostgreSQL마스터 데이터 · 설정(mm_*)
CQLAster TSDB시계열 원본 · 집계(tm_*)
SQLSpark레이크하우스 · 대용량 분석
TQL시계열 엔진(TSE)시간 윈도우 집계 · 갭필

게이트웨이로 보낼 때는 헤더로 언어를 지정합니다.

curl -sk -X POST https://<호스트>:5501/api/v1/query \
-H 'X-Lang: TQL' \
-H 'X-API-Key: <data.gateway.api.key>' \
-H 'Content-Type: text/plain' \
--data "SELECT LAST('1 DAYS', 'END') FROM CHANNEL1.PUMP1.TEMP_0001 \
WHERE timestamp BETWEEN '2022-01-01 00:00:00.000' AND '2030-12-31 23:59:59.999'"

응답은 {"result":"SUCCESS","data":[...]} 꼴입니다.

5500 으로 보내면 5501 로 302 됩니다

5500 은 평문, 5501 은 TLS 입니다. 평문으로 보내도 리다이렉트되므로 처음부터 5501 로 보내는 편이 왕복이 하나 줍니다.

테이블 이름이 «경로» 입니다​

TQL 의 FROM 절은 관계형 테이블명이 아니라 태그 경로입니다.

FROM <채널>.<설비>.<태그>
예: CHANNEL1.PUMP1.TEMP_0001

시각 범위는 WHERE timestamp BETWEEN … AND … 로 주고, 문자열 리터럴은 'YYYY-MM-DD HH:mm:ss.SSS' 입니다.

JDBC 로 붙기​

BI 도구·배치·직접 만든 프로그램은 JDBC 를 씁니다.

Class.forName("plantpulse.timeseries.tql.TQLDriver");

try (Connection c = DriverManager.getConnection(
"jdbc:ts://192.168.0.41:7800", "tse", "<비밀번호>");
Statement st = c.createStatement();
ResultSet rs = st.executeQuery(
"SELECT LAST('1 DAYS','END') FROM CHANNEL1.PUMP1.TEMP_0001 "
+ "WHERE timestamp BETWEEN '2026-09-01 00:00:00.000' "
+ "AND '2026-09-02 00:00:00.000'")) {
while (rs.next()) System.out.println(rs.getString(1));
}

설정으로 주려면 plantpulse-jdbc.properties 의 jdbc.tse.* 를 씁니다.

키값
jdbc.tse.driverplantpulse.timeseries.tql.TQLDriver
jdbc.tse.urljdbc:ts://<호스트>:${PP_TSE_PORT}
jdbc.tse.usernametse
jdbc.tse.password설치가 정한 값

선택 키로 jdbc.tse.pool.initial|min|max 와 jdbc.tse.query.timeout|fetch-size 가 있습니다.

jdbc.tse.url 을 tss(7801)로 바꾸지 마십시오

TQL JDBC 드라이버는 평문 TSE 리스너(7800) 를 씁니다. TSE 클라이언트는 전역적으로 평문 ts/7800 이 기본입니다(2026-08).

tss/7801 로 잡으면 JDBC 접속 실패 → 데이터 게이트웨이 부팅 실패 → /api/v1/* 전부 404 → analytics 카탈로그 404 로 번집니다. 그래서 ts 와 PP_TSE_PORT 로 핀이 박혀 있습니다 → 프로퍼티 레퍼런스

TSE 클라이언트 (자바)​

JDBC 가 읽기 위주라면, TSE 클라이언트는 쓰기까지 하는 네이티브 라이브러리입니다. 플랫폼 자신이 지표를 밀어 넣을 때 쓰는 것과 같은 것입니다.

plantpulse-platform:plantpulse-timeseries-engine-client

두 가지가 있습니다​

클래스무엇언제
TSEClient쓰기를 버퍼링하는 store-and-forward기본. 엔진이 잠깐 끊겨도 쓰기를 잃지 않습니다
DirectTSEClient버퍼 없는 원본 HTTP버퍼가 방해될 때(테스트·일회성 도구)

TSEClient 는 생성자가 DirectTSEClient 와 똑같아서 그대로 바꿔 끼울 수 있습니다. 버퍼 워커 스레드는 첫 버퍼링 쓰기에서 늦게 뜨므로, 질의만 하는 클라이언트는 스레드를 더 쓰지 않습니다.

붙기​

import plantpulse.timeseries.engine.client.TSEClient;

// protocol · host · port · user · password
TSEClient client = new TSEClient("https", "192.168.0.41", 7801, "tse", "<비밀번호>");

// URL 한 줄로도 됩니다
TSEClient client2 = new TSEClient("https://192.168.0.41:7801");

기본값은 https · 7801 · 타임아웃 60초 입니다.

클라이언트 기본은 7801(TLS), JDBC 는 7800(평문)

둘이 다릅니다. TSE 클라이언트는 DEFAULT_PROTOCOL=https · DEFAULT_PORT=7801 이고, JDBC 드라이버는 평문 7800 입니다(위 danger 참고). 같은 엔진의 두 리스너입니다.

값 쓰기​

import plantpulse.timeseries.engine.client.builder.MetricBuilder;

MetricBuilder builder = MetricBuilder.getInstance();
builder.addMetric("PLANTPULSE.LINE1.PUMP1.TEMP")
.addDataPoint(System.currentTimeMillis(), 42.7)
.addTag("site", "SITE_00001");

client.pushMetrics(builder);

값 읽기​

import plantpulse.timeseries.engine.client.builder.QueryBuilder;

QueryBuilder q = QueryBuilder.getInstance();
// 범위와 메트릭을 지정한 뒤
QueryResponse res = client.query(q);

JSON 을 직접 만들었다면 client.query(String jsonText) 로 그대로 보낼 수 있습니다.

그 밖에 할 수 있는 것​

하려는 일메서드
메트릭 이름 목록getMetricNames()
엔진 상태getStatus() · getStatusCheck()
롤업(사전 집계) 작업 관리createRollupTask() · getRollupTasks() · deleteRollupTask()
메트릭 삭제deleteMetric(name) · delete(QueryBuilder)
메타데이터getMetricMetadata() · setMetricMetadata() · deleteMetricMetadata()
태그 질의queryTags(QueryTagBuilder)

어느 길을 고르나​

상황쓸 것
앱에서 네 백엔드를 한 창구로게이트웨이 POST /api/v1/query + X-Lang
자바 프로그램에서 TSE 만JDBC (jdbc:ts://)
PlantPulse Dashboard · BI 도구JDBC → 대시보드 만들기
클라이언트 라이브러리로 편하게Data Gateway 클라이언트 의 tql()
자바에서 TSE 에 쓰기까지TSE 클라이언트 — 위 절

함께 보기​