7. 持久性服务概述
在默认的 QoS 设置下,DataWriter 的历史记录仅在其生命周期内对 DataReader 可用。这意味着在 DataWriter 初始化之间,历史记录并不会持久化,因此每次创建 DataWriter 时都会处于空状态。同样,DataReader 的历史记录也不会持续到其生命周期结束,因此在创建 DataReader 时也是空的。然而,eProsima Fast DDS 提供了将 DataWriter 的历史记录存储到持久数据库中的可能性,以便 DataWriter 在创建时能够从中加载其历史记录。此外,还可以配置 DataReaders 将最后通知的更改存储在数据库中,以便它们在创建时能够恢复其状态。
这种机制允许在启动数据分发服务时恢复先前的状态,从而为应用程序增加了鲁棒性,例如,在意外关闭的情况下。通过配置持久性服务,DataWriters 和 DataReaders 可以从关闭发生时的状态重新开始操作。
注意:请注意,DataReaders 并不将其历史存储到数据库中,而只是将来自 DataWriter 的最后通知更改存储。这意味着它们将在离开的地方恢复操作,但不会拥有之前的信息,因为这些信息已经通知给应用程序。
7.1 配置
持久性服务的配置是通过设置适当的 DurabilityQosPolicy
来完成,并指定每个实体(DomainParticipant、DataWriter 或 DataReader)的 PropertyPolicyQos
适当属性。
要使持久性服务有效,DurabilityQosPolicyKind
必须设置为 TRANSIENT_DURABILITY_QOS
或 PERSISTENT_DURABILITY_QOS
。
必须为使用该属性 dds.persistence.guid
的实体设置一个持久性标识符(Guid_t)。此标识符用于从数据库加载适当的数据,同时还用于在重启之间同步 DataWriter 和 DataReader。GUID 由16字节组成,分为两组:
- 前12字节对应于
GuidPrefix_t
。 - 后4字节对应于
EntityId_t
。
持久性标识符以一串12个用点分隔的字节表示,这些字节采用十六进制格式,然后是垂直线分隔符(|)和另外4个用点分隔的字节,也以十六进制格式表示(见示例)。有关选择适合 DataReader 和 DataWriter 的 GUID,请参考 RTPS 标准(第9.3.1节:全局唯一标识符 (GUID))。
如果未指定 dds.persistence.guid
,则耐用行为将回退为 TRANSIENT_LOCAL_DURABILITY_QOS
。
必须配置一个持久性插件来管理数据库,通过属性 dds.persistence.plugin
指定(参见 PERSISTENCE: SQLIITE3 内置插件)。
7.2 PERSISTENCE:SQLITE3 内置插件
此插件通过使用 SQLite3 API 提供对本地数据库文件的持久化。要激活该插件,需要将 dds.persistence.plugin
属性添加到 DomainParticipant、DataWriter 或 DataReader 的 PropertyPolicyQos 中,其值为 builtin.SQLITE3
。此外,还必须将 dds.persistence.sqlite3.filename
属性添加到实体 PropertyPolicyQos 中,以指定数据库文件名。这些属性总结如下表:
属性名称 | 属性值 |
---|---|
dds.persistence.plugin | builtin.SQLITE3 |
dds.persistence.sqlite3.filename | 用于持久存储的文件名。默认值:persistence.db |
注意:为了避免由于并发访问 SQLite3 数据库而造成的不必要延迟,建议为每个 DataWriter 和 DataReader 指定不同的数据库文件。
重要:DomainParticipant 的 PropertyPolicyQos 中设置的插件仅在不存在或无效的数据写入者/数据读取者中有效。
内容由零声教学AI助手提供,问题来源于学员提问