• 大对象
    • 概念
    • 功能
    • SequoiaDB Shell支持的操作
    • 示例

    大对象

    概念

    大对象(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' )