未验证 提交 f28de86e 编写于 作者: B Bo Ding 提交者: GitHub

refine doc structrue, add placehoders for sample codes (#11007)

* insert - create files

* refine slug

* create sample files for query

* add note
上级 4450cc9d
---
sidebar_label: 建立连接
sidebar_position: 4
---
# 建立连接 # 建立连接
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";
...@@ -70,7 +65,7 @@ TDengine 提供了 RESTful 接口,应用程序无需安装任何依赖,只 ...@@ -70,7 +65,7 @@ TDengine 提供了 RESTful 接口,应用程序无需安装任何依赖,只
<TabItem label="Java" value="java"> <TabItem label="Java" value="java">
<ConnJavaNative /> <ConnJavaNative />
</TabItem> </TabItem>
<TabItem label="Python" value="Python"> <TabItem label="Python" value="python">
<ConnPythonNative /> <ConnPythonNative />
</TabItem> </TabItem>
<TabItem label="Go" value="go"> <TabItem label="Go" value="go">
......
label: 数据建模 label: 数据建模
---
slug: /model
---
# TDengine 数据建模 # TDengine 数据建模
TDengine 采用关系型数据模型,需要建库、建表。因此对于一个具体的应用场景,需要考虑库、超级表和普通表的设计。本节不讨论细致的语法规则,只介绍概念。 TDengine 采用关系型数据模型,需要建库、建表。因此对于一个具体的应用场景,需要考虑库、超级表和普通表的设计。本节不讨论细致的语法规则,只介绍概念。
......
...@@ -2,33 +2,52 @@ ...@@ -2,33 +2,52 @@
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem"; import TabItem from "@theme/TabItem";
import JavaSQL from "./_java_sql.mdx";
import JavaStmt from "./_java_stmt.mdx";
import PySQL from "./_py_sql.mdx";
import PyStmt from "./_py_stmt.mdx";
import GoSQL from "./_go_sql.mdx";
import GoStmt from "./_go_stmt.mdx";
import RustSQL from "./_rust_sql.mdx";
import RustStmt from "./_rust_stmt.mdx";
import NodeSQL from "./_js_sql.mdx";
import NodeStmt from "./_js_stmt.mdx";
import CsSQL from "./_cs_sql.mdx";
import CsStmt from "./_cs_stmt.mdx";
import CSQL from "./_c_sql.mdx";
import CStmt from "./_c_stmt.mdx";
## SQL 写入 ## SQL 写入
应用通过 C/C++, Java, Go, C#, Python, Node.js 连接器执行 SQL insert 语句来插入数据,用户还可以通过 TAOS Shell,手动输入 SQL insert 语句插入数据。比如下面这条 insert 就将一条记录写入到表 d1001 中: 应用通过连接器执行 insert 语句来插入数据,用户还可以通过 TAOS Shell,手动输入 insert 语句插入数据。比如下面这条 insert 就将一条记录写入到表 d1001 中:
```mysql ```sql
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31); INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31);
``` ```
TDengine 支持一次写入多条记录,比如下面这条命令就将两条记录写入到表 d1001 中: TDengine 支持一次写入多条记录,比如下面这条命令就将两条记录写入到表 d1001 中:
```mysql ```sql
INSERT INTO d1001 VALUES (1538548684000, 10.2, 220, 0.23) (1538548696650, 10.3, 218, 0.25); INSERT INTO d1001 VALUES (1538548684000, 10.2, 220, 0.23) (1538548696650, 10.3, 218, 0.25);
``` ```
TDengine 也支持一次向多个表写入数据,比如下面这条命令就向 d1001 写入两条记录,向 d1002 写入一条记录: TDengine 也支持一次向多个表写入数据,比如下面这条命令就向 d1001 写入两条记录,向 d1002 写入一条记录:
```mysql ```sql
INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, 218, 0.33) d1002 VALUES (1538548696800, 12.3, 221, 0.31); INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, 218, 0.33) d1002 VALUES (1538548696800, 12.3, 221, 0.31);
``` ```
详细的 SQL INSERT 语法规则请见 [TAOS SQL 的数据写入](https://www.taosdata.com/cn/documentation/taos-sql#insert) 章节。 详细的 SQL INSERT 语法规则请见 [TAOS SQL 的数据写入](/reference/taos-sql/insert) 章节。
:::tip :::info
- 要提高写入效率,需要批量写入。一批写入的记录条数越多,插入效率就越高。但一条记录不能超过 16K,一条 SQL 语句总长度不能超过 1M 。 - 要提高写入效率,需要批量写入。一批写入的记录条数越多,插入效率就越高。但一条记录不能超过 16K,一条 SQL 语句总长度不能超过 1M 。
- TDengine 支持多线程同时写入,要进一步提高写入速度,一个客户端需要打开 20 个以上的线程同时写。但线程数达到一定数量后,无法再提高,甚至还会下降,因为线程频繁切换,带来额外开销。 - TDengine 支持多线程同时写入,要进一步提高写入速度,一个客户端需要打开 20 个以上的线程同时写。但线程数达到一定数量后,无法再提高,甚至还会下降,因为线程频繁切换,带来额外开销。
:::
:::warning
- 对同一张表,如果新插入记录的时间戳已经存在,默认情形下(UPDATE=0)新记录将被直接抛弃,也就是说,在一张表里,时间戳必须是唯一的。如果应用自动生成记录,很有可能生成的时间戳是一样的,这样,成功插入的记录条数会小于应用插入的记录条数。如果在创建数据库时使用了 UPDATE 1 选项,插入相同时间戳的新记录将覆盖原有记录。 - 对同一张表,如果新插入记录的时间戳已经存在,默认情形下(UPDATE=0)新记录将被直接抛弃,也就是说,在一张表里,时间戳必须是唯一的。如果应用自动生成记录,很有可能生成的时间戳是一样的,这样,成功插入的记录条数会小于应用插入的记录条数。如果在创建数据库时使用了 UPDATE 1 选项,插入相同时间戳的新记录将覆盖原有记录。
- 写入的数据的时间戳必须大于当前时间减去配置参数 keep 的时间。如果 keep 配置为 3650 天,那么无法写入比 3650 天还早的数据。写入数据的时间戳也不能大于当前时间加配置参数 days。如果 days 为 2,那么无法写入比当前时间还晚 2 天的数据。 - 写入的数据的时间戳必须大于当前时间减去配置参数 keep 的时间。如果 keep 配置为 3650 天,那么无法写入比 3650 天还早的数据。写入数据的时间戳也不能大于当前时间加配置参数 days。如果 days 为 2,那么无法写入比当前时间还晚 2 天的数据。
...@@ -38,28 +57,67 @@ INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6, ...@@ -38,28 +57,67 @@ INSERT INTO d1001 VALUES (1538548685000, 10.3, 219, 0.31) (1538548695000, 12.6,
### 普通 SQL 写入 ### 普通 SQL 写入
<Tabs defaultValue="java"> <Tabs defaultValue="java" groupId="lang">
<TabItem label="Java" value="java"></TabItem> <TabItem label="Java" value="java">
<TabItem label="Python" value="Python"></TabItem> <JavaSQL />
<TabItem label="Go" value="go"></TabItem> </TabItem>
<TabItem label="C" value="c"></TabItem> <TabItem label="Python" value="python">
<TabItem label="Rust" value="rust"></TabItem> <PySQL />
<TabItem label="Node.js" value="nodejs"></TabItem> </TabItem>
<TabItem label="C#" value="csharp"></TabItem> <TabItem label="Go" value="go">
<GoSQL />
</TabItem>
<TabItem label="Rust" value="rust">
<RustSQL />
</TabItem>
<TabItem label="Node.js" value="nodejs">
<NodeSQL />
</TabItem>
<TabItem label="C#" value="csharp">
<CsSQL />
</TabItem>
<TabItem label="C" value="c">
<CSQL />
</TabItem>
</Tabs> </Tabs>
### 动态绑定写入 :::note
(补充介绍) 1. 无论 RESTFful 方式建立连接还是本地驱动方式建立连接,以上示例代码都能正常工作。
2. 唯一需要注意的是:由于 RESTful 接口无状态, 不能使用 `use db` 语句来切换数据库。
### 示例代码 :::
<Tabs defaultValue="java"> ### 动态绑定写入
<TabItem label="Java" value="java"></TabItem>
<TabItem label="Python" value="Python"></TabItem> TDengine 也提供了支持参数绑定的 Prepare API,与 MySQL 一样,这些 API 目前也仅支持用问号 `?` 来代表待绑定的参数。文档中有时也会把此功能称为“原生接口写入”。从 2.1.1.0 和 2.1.2.0 版本开始,TDengine 大幅改进了参数绑定接口对数据写入(INSERT)场景的支持。这样在通过参数绑定接口写入数据时,就避免了 SQL 语法解析的资源消耗,从而在绝大多数情况下显著提升写入性能。
<TabItem label="Go" value="go"></TabItem>
<TabItem label="C" value="c"></TabItem> <Tabs defaultValue="java" groupId="lang">
<TabItem label="Rust" value="rust"></TabItem> <TabItem label="Java" value="java">
<TabItem label="Node.js" value="nodejs"></TabItem> <JavaStmt />
<TabItem label="C#" value="csharp"></TabItem> </TabItem>
<TabItem label="Python" value="python">
<PyStmt />
</TabItem>
<TabItem label="Go" value="go">
<GoStmt />
</TabItem>
<TabItem label="Rust" value="rust">
<RustStmt />
</TabItem>
<TabItem label="Node.js" value="nodejs">
<NodeStmt />
</TabItem>
<TabItem label="C#" value="csharp">
<CsStmt />
</TabItem>
<TabItem label="C" value="c">
<CStmt />
</TabItem>
</Tabs> </Tabs>
:::note
只有使用本地驱动方式连接连接,才能使用动态绑定工具。
:::
\ No newline at end of file
...@@ -4,4 +4,38 @@ sidebar_label: InfluxDB Line 协议 ...@@ -4,4 +4,38 @@ sidebar_label: InfluxDB Line 协议
# InfluxDB Line 协议 # InfluxDB Line 协议
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
import JavaLine from "./_java_line.mdx";
import PyLine from "./_py_line.mdx";
import GoLine from "./_go_line.mdx";
import RustLine from "./_rust_line.mdx";
import NodeLine from "./_js_line.mdx";
import CsLine from "./_cs_line.mdx";
import CLine from "./_c_line.mdx";
## 示例代码 ## 示例代码
<Tabs defaultValue="java" groupId="lang">
<TabItem label="Java" value="java">
<JavaLine />
</TabItem>
<TabItem label="Python" value="Python">
<PyLine />
</TabItem>
<TabItem label="Go" value="go">
<GoLine />
</TabItem>
<TabItem label="Rust" value="rust">
<RustLine />
</TabItem>
<TabItem label="Node.js" value="nodejs">
<NodeLine />
</TabItem>
<TabItem label="C#" value="csharp">
<CsLine />
</TabItem>
<TabItem label="C" value="c">
<CLine />
</TabItem>
</Tabs>
...@@ -4,4 +4,38 @@ sidebar_label: OpentsDB Telnet 协议 ...@@ -4,4 +4,38 @@ sidebar_label: OpentsDB Telnet 协议
# OpentsDB Telnet 协议 # OpentsDB Telnet 协议
## 示例代码 import Tabs from "@theme/Tabs";
\ No newline at end of file import TabItem from "@theme/TabItem";
import JavaTelnet from "./_java_opts_telnet.mdx";
import PyTelnet from "./_py_opts_telnet.mdx";
import GoTelnet from "./_go_opts_telnet.mdx";
import RustTelnet from "./_rust_opts_telnet.mdx";
import NodeTelnet from "./_js_opts_telnet.mdx";
import CsTelnet from "./_cs_opts_telnet.mdx";
import CTelnet from "./_c_opts_telnet.mdx";
## 示例代码
<Tabs defaultValue="java" groupId="lang">
<TabItem label="Java" value="java">
<JavaTelnet />
</TabItem>
<TabItem label="Python" value="Python">
<PyTelnet />
</TabItem>
<TabItem label="Go" value="go">
<GoTelnet />
</TabItem>
<TabItem label="Rust" value="rust">
<RustTelnet />
</TabItem>
<TabItem label="Node.js" value="nodejs">
<NodeTelnet />
</TabItem>
<TabItem label="C#" value="csharp">
<CsTelnet />
</TabItem>
<TabItem label="C" value="c">
<CTelnet />
</TabItem>
</Tabs>
...@@ -4,4 +4,38 @@ sidebar_label: OpentsDB JSON 格式协议 ...@@ -4,4 +4,38 @@ sidebar_label: OpentsDB JSON 格式协议
# OpentsDB JSON 格式协议 # OpentsDB JSON 格式协议
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
import JavaJson from "./_java_opts_json.mdx";
import PyJson from "./_py_opts_json.mdx";
import GoJson from "./_go_opts_json.mdx";
import RustJson from "./_rust_opts_json.mdx";
import NodeJson from "./_js_opts_json.mdx";
import CsJson from "./_cs_opts_json.mdx";
import CJson from "./_c_opts_json.mdx";
## 示例代码 ## 示例代码
<Tabs defaultValue="java" groupId="lang">
<TabItem label="Java" value="java">
<JavaJson />
</TabItem>
<TabItem label="Python" value="Python">
<PyJson />
</TabItem>
<TabItem label="Go" value="go">
<GoJson />
</TabItem>
<TabItem label="Rust" value="rust">
<RustJson />
</TabItem>
<TabItem label="Node.js" value="nodejs">
<NodeJson />
</TabItem>
<TabItem label="C#" value="csharp">
<CsJson />
</TabItem>
<TabItem label="C" value="c">
<CJson />
</TabItem>
</Tabs>
label: 写入数据 label: 写入数据
link: link:
type: generated-index type: generated-index
description: "TDengine 支持多种接口写入数据,包括 SQL,Prometheus,Telegraf,collectd,StatsD,EMQ MQTT Broker,HiveMQ Broker,CSV 文件等,后续还将提供 Kafka,OPC 等接口。数据可以单条插入,也可以批量插入,可以插入一个数据采集点的数据,也可以同时插入多个数据采集点的数据。支持多线程插入,支持时间乱序数据插入,也支持历史数据插入。" slug: /insert-data/
keywords: description: "TDengine 支持多种接口写入协议,包括 SQL,InfluxDB Line 协议, OpentsDB Telnet 协议, OpentsDB JSON 格式协议。数据可以单条插入,也可以批量插入,可以插入一个数据采集点的数据,也可以同时插入多个数据采集点的数据。支持多线程插入,支持时间乱序数据插入,也支持历史数据插入。"
[
SQL,
Prometheus,
Telegraf,
collectd,
StatsD,
EMQ MQTT Broker,
HiveMQ Broker,
CSV,
]
---
slug: /query-data
---
# 查询数据 # 查询数据
import Tabs from "@theme/Tabs"; import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem"; import TabItem from "@theme/TabItem";
import JavaQuery from "./_java.mdx";
import PyQuery from "./_py.mdx";
import GoQuery from "./_go.mdx";
import RustQuery from "./_rust.mdx";
import NodeQuery from "./_js.mdx";
import CsQuery from "./_cs.mdx";
import CQuery from "./_c.mdx";
import PyAsync from "./_py_async.mdx";
import GoAsync from "./_go_async.mdx";
import NodeAsync from "./_js_async.mdx";
import CsAsync from "./_cs_async.mdx";
import CAsync from "./_c_async.mdx";
## 主要查询功能 ## 主要查询功能
...@@ -103,25 +119,62 @@ Query OK, 5 row(s) in set (0.001521s) ...@@ -103,25 +119,62 @@ Query OK, 5 row(s) in set (0.001521s)
## 示例代码 ## 示例代码
### 同步查询 ### 查询数据
<Tabs defaultValue="java"> <Tabs defaultValue="java" groupId="lang">
<TabItem label="Java" value="java"></TabItem> <TabItem label="Java" value="java">
<TabItem label="Python" value="Python"></TabItem> <JavaStmt />
<TabItem label="Go" value="go"></TabItem> </TabItem>
<TabItem label="C" value="c"></TabItem> <TabItem label="Python" value="python">
<TabItem label="Rust" value="rust"></TabItem> <PyStmt />
<TabItem label="Node.js" value="nodejs"></TabItem> </TabItem>
<TabItem label="C#" value="csharp"></TabItem> <TabItem label="Go" value="go">
<GoStmt />
</TabItem>
<TabItem label="Rust" value="rust">
<RustStmt />
</TabItem>
<TabItem label="Node.js" value="nodejs">
<NodeStmt />
</TabItem>
<TabItem label="C#" value="csharp">
<CsStmt />
</TabItem>
<TabItem label="C" value="c">
<CStmt />
</TabItem>
</Tabs> </Tabs>
:::note
1. 无论 RESTFful 方式建立连接还是本地驱动方式建立连接,以上示例代码都能正常工作。
2. 唯一需要注意的是:由于 RESTful 接口无状态, 不能使用 `use db` 语句来切换数据库。
:::
### 异步查询 ### 异步查询
<Tabs defaultValue="go"> <Tabs defaultValue="python" groupId="lang">
<TabItem label="Python" value="Python"></TabItem> <TabItem label="Python" value="python">
<TabItem label="Go" value="go"></TabItem> <PyAsync />
<TabItem label="C" value="c"></TabItem> </TabItem>
<TabItem label="Rust" value="rust"></TabItem> <TabItem label="Go" value="go">
<TabItem label="Node.js" value="nodejs"></TabItem> <GoAsync />
<TabItem label="C#" value="csharp"></TabItem> </TabItem>
<TabItem label="Node.js" value="nodejs">
<NodeAsync />
</TabItem>
<TabItem label="C#" value="csharp">
<CsAsync />
</TabItem>
<TabItem label="C" value="c">
<CAsync />
</TabItem>
</Tabs> </Tabs>
:::note
只有使用本地驱动方式连接连接,才能使用异步查询功能。
:::
...@@ -4,9 +4,6 @@ sidebar_label: 连续查询 ...@@ -4,9 +4,6 @@ sidebar_label: 连续查询
# 连续查询(Continuous Query) # 连续查询(Continuous Query)
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
连续查询是 TDengine 定期自动执行的查询,采用滑动窗口的方式进行计算,是一种简化的时间驱动的流式计算。针对库中的表或超级表,TDengine 可提供定期自动执行的连续查询,用户可让 TDengine 推送查询的结果,也可以将结果再写回到 TDengine 中。每次执行的查询是一个时间窗口,时间窗口随着时间流动向前滑动。在定义连续查询的时候需要指定时间窗口(time window, 参数 interval)大小和每次前向增量时间(forward sliding times, 参数 sliding)。 连续查询是 TDengine 定期自动执行的查询,采用滑动窗口的方式进行计算,是一种简化的时间驱动的流式计算。针对库中的表或超级表,TDengine 可提供定期自动执行的连续查询,用户可让 TDengine 推送查询的结果,也可以将结果再写回到 TDengine 中。每次执行的查询是一个时间窗口,时间窗口随着时间流动向前滑动。在定义连续查询的时候需要指定时间窗口(time window, 参数 interval)大小和每次前向增量时间(forward sliding times, 参数 sliding)。
TDengine 的连续查询采用时间驱动模式,可以直接使用 TAOS SQL 进行定义,不需要额外的操作。使用连续查询,可以方便快捷地按照时间窗口生成结果,从而对原始采集数据进行降采样(down sampling)。用户通过 TAOS SQL 定义连续查询以后,TDengine 自动在最后的一个完整的时间周期末端拉起查询,并将计算获得的结果推送给用户或者写回 TDengine。 TDengine 的连续查询采用时间驱动模式,可以直接使用 TAOS SQL 进行定义,不需要额外的操作。使用连续查询,可以方便快捷地按照时间窗口生成结果,从而对原始采集数据进行降采样(down sampling)。用户通过 TAOS SQL 定义连续查询以后,TDengine 自动在最后的一个完整的时间周期末端拉起查询,并将计算获得的结果推送给用户或者写回 TDengine。
...@@ -72,15 +69,3 @@ create table avg_vol as select avg(voltage) from meters where ts > now and ts <= ...@@ -72,15 +69,3 @@ create table avg_vol as select avg(voltage) from meters where ts > now and ts <=
用户可在控制台中通过 `show streams` 命令来查看系统中全部运行的连续查询,并可以通过 `kill stream` 命令杀掉对应的连续查询。后续版本会提供更细粒度和便捷的连续查询管理命令。 用户可在控制台中通过 `show streams` 命令来查看系统中全部运行的连续查询,并可以通过 `kill stream` 命令杀掉对应的连续查询。后续版本会提供更细粒度和便捷的连续查询管理命令。
## 示例代码
<Tabs defaultValue="java">
<TabItem label="Java" value="java"></TabItem>
<TabItem label="Python" value="Python"></TabItem>
<TabItem label="Go" value="go"></TabItem>
<TabItem label="C" value="c"></TabItem>
<TabItem label="Rust" value="rust"></TabItem>
<TabItem label="Node.js" value="nodejs"></TabItem>
<TabItem label="C#" value="csharp"></TabItem>
</Tabs>
\ No newline at end of file
--- ---
sidebar_position: 2 sidebar_position: 2
sidebar_label: 订阅 sidebar_label: 数据订阅
--- ---
# 数据订阅(Publisher/Subscriber) # 数据订阅
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
基于数据天然的时间序列特性,TDengine 的数据写入(insert)与消息系统的数据发布(pub)逻辑上一致,均可视为系统中插入一条带时间戳的新记录。同时,TDengine 在内部严格按照数据时间序列单调递增的方式保存数据。本质上来说,TDengine 中里每一张表均可视为一个标准的消息队列。 基于数据天然的时间序列特性,TDengine 的数据写入(insert)与消息系统的数据发布(pub)逻辑上一致,均可视为系统中插入一条带时间戳的新记录。同时,TDengine 在内部严格按照数据时间序列单调递增的方式保存数据。本质上来说,TDengine 中里每一张表均可视为一个标准的消息队列。
...@@ -161,6 +164,18 @@ $ taos ...@@ -161,6 +164,18 @@ $ taos
这时,因为电流超过了 10A,您应该可以看到示例程序将它输出到了屏幕上。您可以继续插入一些数据观察示例程序的输出。 这时,因为电流超过了 10A,您应该可以看到示例程序将它输出到了屏幕上。您可以继续插入一些数据观察示例程序的输出。
## 示例代码
<Tabs defaultValue="java" groupId="lang">
<TabItem label="Java" value="java"></TabItem>
<TabItem label="Python" value="Python"></TabItem>
<TabItem label="Go" value="go"></TabItem>
<TabItem label="C" value="c"></TabItem>
<TabItem label="Rust" value="rust"></TabItem>
<TabItem label="Node.js" value="nodejs"></TabItem>
<TabItem label="C#" value="csharp"></TabItem>
</Tabs>
## Java 使用数据订阅功能 ## Java 使用数据订阅功能
订阅功能也提供了 Java 开发接口,相关说明请见 [Java Connector](https://www.taosdata.com/cn/documentation/connector/java#subscribe)。需要注意的是,目前 Java 接口没有提供异步订阅模式,但用户程序可以通过创建 `TimerTask` 等方式达到同样的效果。 订阅功能也提供了 Java 开发接口,相关说明请见 [Java Connector](https://www.taosdata.com/cn/documentation/connector/java#subscribe)。需要注意的是,目前 Java 接口没有提供异步订阅模式,但用户程序可以通过创建 `TimerTask` 等方式达到同样的效果。
......
# 第三方工具
TDengine 通过对标准 SQL 命令、常用数据库连接器标准(例如 JDBC)、ORM 以及其他流行时序数据库写入协议(例如 InfluxDB Line Protocol、OpenTSDB JSON、OpenTSDB Telnet 等)的支持可以使 TDengine 非常容易和第三方工具共同使用。
label: 第三方工具 label: 第三方工具
link:
type: generated-index
slug: /third-party/
description: TDengine 通过对标准 SQL 命令、常用数据库连接器标准(例如 JDBC)、ORM 以及其他流行时序数据库写入协议(例如 InfluxDB Line Protocol、OpenTSDB JSON、OpenTSDB Telnet 等)的支持可以使 TDengine 非常容易和第三方工具共同使用。
label: 集群管理 label: 集群管理
link: link:
type: generated-index type: generated-index
slug: /cluster/
description: "TDengine支持以集群方式部署,以提升系统的处理能力和高可用性。TDengine集群支持任意数据的多副本从而提升高可用性,并自动实现负载均衡。同时TDengine集群具有很好的横向扩展能力以处理更多的数据采集点和更大的数据量。" description: "TDengine支持以集群方式部署,以提升系统的处理能力和高可用性。TDengine集群支持任意数据的多副本从而提升高可用性,并自动实现负载均衡。同时TDengine集群具有很好的横向扩展能力以处理更多的数据采集点和更大的数据量。"
keywords: keywords:
[ [
......
label: 运维指南 label: 运维指南
link: link:
type: generated-index slug: /operation/
\ No newline at end of file type: generated-index
label: 技术内幕 label: 技术内幕
link: link:
slug: /tdinternal/
type: generated-index type: generated-index
\ No newline at end of file
...@@ -16,7 +16,7 @@ C/C++的 API 类似于 MySQL 的 C API。应用程序使用时,需要包含 TD ...@@ -16,7 +16,7 @@ C/C++的 API 类似于 MySQL 的 C API。应用程序使用时,需要包含 TD
- Linux:`/usr/local/taos/include` - Linux:`/usr/local/taos/include`
- Windows:`C:\TDengine\include` - Windows:`C:\TDengine\include`
```C ```c
#include <taos.h> #include <taos.h>
``` ```
...@@ -72,7 +72,10 @@ C/C++的 API 类似于 MySQL 的 C API。应用程序使用时,需要包含 TD ...@@ -72,7 +72,10 @@ C/C++的 API 类似于 MySQL 的 C API。应用程序使用时,需要包含 TD
返回值为空表示失败。应用程序需要保存返回的参数,以便后续 API 调用。 返回值为空表示失败。应用程序需要保存返回的参数,以便后续 API 调用。
**提示:** 同一进程可以根据不同的 host/port 连接多个 taosd 集群 :::info
同一进程可以根据不同的 host/port 连接多个 taosd 集群
:::
- `char *taos_get_server_info(TAOS *taos)` - `char *taos_get_server_info(TAOS *taos)`
...@@ -146,7 +149,10 @@ typedef struct taosField { ...@@ -146,7 +149,10 @@ typedef struct taosField {
获取最近一次 API 调用失败的原因,返回值为错误代码。 获取最近一次 API 调用失败的原因,返回值为错误代码。
**注意**:2.0 及以上版本 TDengine 推荐数据库应用的每个线程都建立一个独立的连接,或基于线程建立连接池。而不推荐在应用中将该连接 (TAOS\*) 结构体传递到不同的线程共享使用。基于 TAOS 结构体发出的查询、写入等操作具有多线程安全性,但 “USE statement” 等状态量有可能在线程之间相互干扰。此外,C 语言的连接器可以按照需求动态建立面向数据库的新连接(该过程对用户不可见),同时建议只有在程序最后退出的时候才调用 taos_close 关闭连接。 :::note
2.0 及以上版本 TDengine 推荐数据库应用的每个线程都建立一个独立的连接,或基于线程建立连接池。而不推荐在应用中将该连接 (TAOS\*) 结构体传递到不同的线程共享使用。基于 TAOS 结构体发出的查询、写入等操作具有多线程安全性,但 “USE statement” 等状态量有可能在线程之间相互干扰。此外,C 语言的连接器可以按照需求动态建立面向数据库的新连接(该过程对用户不可见),同时建议只有在程序最后退出的时候才调用 taos_close 关闭连接。
:::
### 异步查询 API ### 异步查询 API
...@@ -174,7 +180,6 @@ typedef struct taosField { ...@@ -174,7 +180,6 @@ typedef struct taosField {
TDengine 的异步 API 均采用非阻塞调用模式。应用程序可以用多线程同时打开多张表,并可以同时对每张打开的表进行查询或者插入操作。需要指出的是,**客户端应用必须确保对同一张表的操作完全串行化**,即对同一个表的插入或查询操作未完成时(未返回时),不能够执行第二个插入或查询操作。 TDengine 的异步 API 均采用非阻塞调用模式。应用程序可以用多线程同时打开多张表,并可以同时对每张打开的表进行查询或者插入操作。需要指出的是,**客户端应用必须确保对同一张表的操作完全串行化**,即对同一个表的插入或查询操作未完成时(未返回时),不能够执行第二个插入或查询操作。
<a class="anchor" id="stmt"></a>
### 参数绑定 API ### 参数绑定 API
除了直接调用 `taos_query` 进行查询,TDengine 也提供了支持参数绑定的 Prepare API,与 MySQL 一样,这些 API 目前也仅支持用问号 `?` 来代表待绑定的参数。文档中有时也会把此功能称为“原生接口写入”。 除了直接调用 `taos_query` 进行查询,TDengine 也提供了支持参数绑定的 Prepare API,与 MySQL 一样,这些 API 目前也仅支持用问号 `?` 来代表待绑定的参数。文档中有时也会把此功能称为“原生接口写入”。
...@@ -269,7 +274,6 @@ typedef struct TAOS_MULTI_BIND { ...@@ -269,7 +274,6 @@ typedef struct TAOS_MULTI_BIND {
(2.1.3.0 版本新增) (2.1.3.0 版本新增)
用于在其他 stmt API 返回错误(返回错误码或空指针)时获取错误信息。 用于在其他 stmt API 返回错误(返回错误码或空指针)时获取错误信息。
<a class="anchor" id="schemaless"></a>
### Schemaless 方式写入接口 ### Schemaless 方式写入接口
除了使用 SQL 方式或者使用参数绑定 API 写入数据外,还可以使用 Schemaless 的方式完成写入。Schemaless 可以免于预先创建超级表/数据子表的数据结构,而是可以直接写入数据,TDengine 系统会根据写入的数据内容自动创建和维护所需要的表结构。Schemaless 的使用方式详见 [Schemaless 写入](https://www.taosdata.com/cn/documentation/insert#schemaless) 章节,这里介绍与之配套使用的 C/C++ API。 除了使用 SQL 方式或者使用参数绑定 API 写入数据外,还可以使用 Schemaless 的方式完成写入。Schemaless 可以免于预先创建超级表/数据子表的数据结构,而是可以直接写入数据,TDengine 系统会根据写入的数据内容自动创建和维护所需要的表结构。Schemaless 的使用方式详见 [Schemaless 写入](https://www.taosdata.com/cn/documentation/insert#schemaless) 章节,这里介绍与之配套使用的 C/C++ API。
...@@ -391,13 +395,19 @@ TDengine 提供时间驱动的实时流式计算 API。可以每隔一指定的 ...@@ -391,13 +395,19 @@ TDengine 提供时间驱动的实时流式计算 API。可以每隔一指定的
- param:调用 `taos_subscribe`时客户程序提供的附加参数 - param:调用 `taos_subscribe`时客户程序提供的附加参数
- code:错误码 - code:错误码
**注意**:在这个回调函数里不可以做耗时过长的处理,尤其是对于返回的结果集中数据较多的情况,否则有可能导致客户端阻塞等异常状态。如果必须进行复杂计算,则建议在另外的线程中进行处理。 :::note
在这个回调函数里不可以做耗时过长的处理,尤其是对于返回的结果集中数据较多的情况,否则有可能导致客户端阻塞等异常状态。如果必须进行复杂计算,则建议在另外的线程中进行处理。
:::
- `TAOS_RES *taos_consume(TAOS_SUB *tsub)` - `TAOS_RES *taos_consume(TAOS_SUB *tsub)`
同步模式下,该函数用来获取订阅的结果。 用户应用程序将其置于一个循环之中。 如两次调用`taos_consume`的间隔小于订阅的轮询周期,API 将会阻塞,直到时间间隔超过此周期。 如果数据库有新记录到达,该 API 将返回该最新的记录,否则返回一个没有记录的空结果集。 如果返回值为 `NULL`,说明系统出错。 异步模式下,用户程序不应调用此 API。 同步模式下,该函数用来获取订阅的结果。 用户应用程序将其置于一个循环之中。 如两次调用`taos_consume`的间隔小于订阅的轮询周期,API 将会阻塞,直到时间间隔超过此周期。 如果数据库有新记录到达,该 API 将返回该最新的记录,否则返回一个没有记录的空结果集。 如果返回值为 `NULL`,说明系统出错。 异步模式下,用户程序不应调用此 API。
**注意**:在调用 `taos_consume()` 之后,用户应用应确保尽快调用 `taos_fetch_row()` 或 `taos_fetch_block()` 来处理订阅结果,否则服务端会持续缓存查询结果数据等待客户端读取,极端情况下会导致服务端内存消耗殆尽,影响服务稳定性。 :::note
在调用 `taos_consume()` 之后,用户应用应确保尽快调用 `taos_fetch_row()` 或 `taos_fetch_block()` 来处理订阅结果,否则服务端会持续缓存查询结果数据等待客户端读取,极端情况下会导致服务端内存消耗殆尽,影响服务稳定性。
:::
- `void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress)` - `void taos_unsubscribe(TAOS_SUB *tsub, int keepProgress)`
......
label: 参考指南 label: 参考指南
link: link:
slug: /reference/
type: generated-index type: generated-index
\ No newline at end of file
label: 应用实践 label: 应用实践
link: link:
slug: /application/
type: generated-index type: generated-index
label: 物联网大数据
\ No newline at end of file
label: 物联网大数据
link:
type: generated-index
\ No newline at end of file
label: FAQ、教程及其它 label: FAQ、教程及其它
link: link:
slug: /train-faq/
type: generated-index type: generated-index
package com.taos.example;
public class RestInsertExmaple {
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册