数据写入

当前版本:v1.4, 更新时间:2019-10-18

松果时序数据库支持文本协议(sql语句)和二进制协议数据写入,他们的差别如下:

  • 文本协议:执行SQL的insert语句插入数据,sql需要服务端解析,性能稍低。

  • 二进制协议:直接从报文中获取数据,带宽占用比文本协议低,性能高。 在.Net中以DataTable为参数写入;在java中以PreparedStatement配合addBatch,并且所有数据都必须使用参数。

松果时序数据库支持一次写入一条或多条数据,不管是文本协议还是二进制协议都必须满足下面的条件:(1) 单次请求只能向一个表中写入数据。(2) 单次请求写入数据的上限为1000条。(3) 单次请求写入的数据报文大小不超过4MB。 (4) 写入数据的时间戳必须处于写入时间窗口。

写入数据时,必须指定设备Id(devid)和时间戳(tstamp)的值,其他字段若没有指定值,会以该类型的默认值填充。

1. 顺序写入和随机写入的差别

松果时序数据库写入数据时,根据数据的时间戳(tstamp)的值分配到不同的数据文件。数据文件以天为单位组织,需要注意的是:天的划分以格林尼治时间为标准,用于中国位于东八区,实际的划分为每天早上八点到第二天早上八点前的数据存储在一个文件中。若针对某个设备,写入记录的时间戳大于所处数据文件中该设备所有记录的时间戳,或大部分写入(90%以上)满足前述条件,此时认为写入是顺序写入;否则,认为写入是随机写入。顺序写入和随机写入有以下差别:(1) 顺序写入性能高于随机写入。(2) 对于普通数据文件(sys_datafile中的filetype值为normal),同样的数据以顺序写入占用空间小于随机写入占用的空间。由于压缩文件(sys_datafile中filetype值为compress)不支持用户直接写入,不存在这个差别。

高频写入数据会由于数据库服务内存不能及时写入磁盘,插入数据时返回 PdbE_RETRY错误码,此时可以暂停3-5秒后重新执行。

2. 以文本协议写入数据

使用松果时序数据库的SDK执行写入,传递如下数据即可:

  1. INSERT INTO tab01(devid, tstamp, val01)
  2. VALUES(1, now(), 101),(2, now(), 102),(3, now(), 103)

注意:以文本协议写入多条数据时,若某条数据写入失败,则中止后面的数据写入,返回对应的错误码及成功写入的数据条数。

3. 以二进制协议写入数据

在.Net中支持以一个DataTable写入,具体使用方式参考.Net的SDK文档。以DataTable写入时,除了需要满足本节开头列出的条件外,还需要满足:

  • 松果时序数据库中存在对应的表。

  • DataTable中出现的列都在相应的表中存在,并且类型匹配。列名不区分大小写。

在Java中以PreparedStatement配合addBatch,并且每个值都必须使用参数指定。来使用二进制协议写入数据。具体细节参考JDBC的SDK文档。注意:与以文本协议写入数据不同,当其中某条数据写入失败时,其后的数据会继续写入,最终返回对应的错误码、成功写入的数据条数以及每条数据执行的结果。具体使用方式参考对应SDK文档。

4. 数据更新

若需要更新已写入的数据,将新数据重新写入即可。需要注意的是,未指定的列将会以默认值填充