大对象

概念

大对象(LOB)功能旨在突破 SequoiaDB 的单条记录最大长度为 16MB 的限制,为用户写入和读取更大型记录提供便利。LOB 记录的大小目前不受限制。

每一个 LOB 记录拥有一个 OID,通过指定集合及 OID 可以访问一条 LOB 记录。在非分区集合及哈希分区集合中均可使用 LOB 功能。集合间不共享 LOB 记录。当一个集合被删除时,其拥有的 LOB 记录自动删除。

LOB 记录的存储格式:

LOB的记录格式

每个 LOB 记录包含若干个分片。分片所占空间大小均为 LobPageSize(创建集合空间时指定,默认为 256 KB,请参考 Sdb.createCS())。在哈希分区中,LOB 记录的每一个分片会被按照 OID 加分片序号分散存储在相应的分区组中。其哈希空间与所属集合的哈希空间相同。

目前 LOB 的存储格式为二进制类型。

功能

支持LOB的顺序读写和随机读写,支持LOB的打开读操作和打开写操作,支持并发读和并发写。

  • 在创建LOB时,LOB对象不可读,也不可删除。
  • 在打开读LOB时,LOB对象不可写,也不可删除,可以并发读。
  • 在打开写LOB时,LOB对象不可读,也不可删除,可以并发写。并发写时需要按写入的数据段加锁并seek到加锁的数据段后写入数据,可以覆盖原有数据写入。并发锁定的数据段不能重叠。可查看各驱动API的lock和lockAndSeek接口。
  • 在删除LOB时,LOB对象不可读写。

SequoiaDB Shell支持的操作

操作参见备注
创建SdbCollection.putLob()向集合中创建一个 LOB 记录。LOB 记录一旦创建完毕,其内容无法再做更改。
读取SdbCollection.getLob()从集合中读取某个 LOB 记录。驱动中提供对 LOB 记录的 seek 操作。
删除SdbCollection.deleteLob()删除集合中的某个 LOB 对象。
列表SdbCollection.listLobs()列出集合中所有 LOB 对象。

示例

在 Sdb Shell 中将本地文件 mylob 上传至集合 foo.bar 中:

  1. > db.foo.bar.putLob( '/opt/mylob' )

在 Sdb Shell 中查看 LOB 记录及对应的 OID:

  1. > db.foo.bar.listLobs()
  2. {
  3. "Size": 76602,
  4. "Oid": {
  5. "$oid": "5435e7b69487faa663000897"
  6. },
  7. "CreateTime": {
  8. "$timestamp": "2018-02-26-12.51.43.628000"
  9. },
  10. "Available": true
  11. }

在 Sdb Shell 中将集合 foo.bar 中的 OID 为 5435e7b69487faa663000897 的LOB 记录下载到本地文件 mylob 中:

  1. > db.foo.bar.getLob( '5435e7b69487faa663000897', '/opt/mylob' )

在 Sdb Shell 中将集合 foo.bar 中的 OID 为 5435e7b69487faa663000897 的 LOB 记录删除:

  1. > db.foo.bar.deleteLob( '5435e7b69487faa663000897' )