2.3.16 NdbEventOperation类

本节提供有关 NdbEventOperation类的信息,该类用于监视数据库中的更改(事件)。它提供了用于实现 NDB Cluster Replication 的核心功能。

NdbEventOperation 类概述

家长班

没有任何

儿童班

没有任何

描述

NdbEventOperation表示一个数据库事件。

方法

下表列出了该类的公共方法以及每个方法的用途或用途:

表 2.41 NdbEventOperation 类方法及说明

姓名 描述
clearError() 清除最近的错误。在 NDB 7.4 中已弃用。
execute() 激活NdbEventOperation
getBlobHandle() 获取用于读取 blob 属性的句柄
getEpoch() 检索最近检索到的事件数据的纪元。在 NDB 7.4 中添加。
getEventType() 获取事件类型。在 NDB 7.4 中已弃用。
getEventType2() 获取事件类型。在 NDB 7.4 中添加。
getGCI() 检索最近检索到的事件的 GCI。在 NDB 7.4 中已弃用。
getLatestGCI() 检索最近的 GCI(无论是否已检索到相应的事件)。在 NDB 7.4 中已弃用。
getNdbError() 获取最近的错误
getPreBlobHandle() 获取用于读取前一个 blob 属性的句柄
getPreValue() 检索属性的先前值
getState() 获取事件操作的当前状态
getValue() 检索属性值
hasError() 作为此操作的一部分,是否发生了错误。在 NDB 7.4 中已弃用。
isConsistent() 检测节点故障导致的事件丢失。在 NDB 7.4 中已弃用。
isEmptyEpoch() 检测到一个空的纪元。在 NDB 7.4 中添加。
isErrorEpoch() 检测错误纪元,如果有则检索错误。在 NDB 7.4 中添加。
isOverrun() 是否由于缓冲区溢出而发生事件丢失。在 NDB 7.4 中已弃用。
mergeEvents() 使合并事件成为可能
tableFragmentationChanged() 检查表的碎片是否已更改
tableFrmChanged() 检查表.FRM文件是否已更改
tableNameChanged() 检查表的名称是否已更改
tableRangeListChanged() 检查表范围分区列表名称是否已更改

类型

NdbEventOperation定义了一种枚举类型, State 类型。

创建 NdbEventOperation 的实例。  此类没有公共构造函数或析构函数。取而代之的是, 的实例是作为对和 对象 NdbEventOperation的方法调用的结果而创建的, 并符合以下条件:NdbNdbDictionary

  1. 必须存在一个使用创建的事件 Dictionary::createEvent()。此方法返回 Event该类的一个实例。

  2. NdbEventOperation对象是使用 实例化的 ,Ndb::createEventOperation()它作用于 的实例 Event

通过调用删除此类的实例 Ndb::dropEventOperation

小费

第 2.5.9 节“NDB API 事件处理示例” 中提供了演示创建和删除事件操作的详细示例 。

已知的问题。  在 NDB API 中处理事件操作时可能会遇到以下问题:

  • 活动对象的最大数量 NdbEventOperation目前在编译时固定为 2 * MaxNoOfTables

  • 目前,所有INSERTDELETEUPDATE 事件以及所有属性更改都会发送到 API,即使只指定了一些属性也是如此。但是,这些对用户是隐藏的,调用后只显示相关数据 Ndb::nextEvent()

    请注意,可能会出现错误退出 Ndb::pollEvents(),因此以下nextEvent()调用返回零,因为没有可用数据。在这种情况下,只需pollEvents()再次致电即可。

    请参阅Ndb::pollEvents()Ndb::nextEvent() (已弃用)

  • 事件代码不检查表架构版本。删除表时,请确保删除任何关联的事件。

  • 如果您收到了一个完整的纪元,则即使在节点出现故障的情况下,也不会重新发送来自该纪元的事件。但是,如果发生节点故障,则后续纪元可能包含重复事件,这些事件可以通过重复的主键来识别。

    在 NDB Cluster 复制代码中, INSERT操作上的重复主键通常通过将此类插入视为REPLACE 操作来处理。

小费

要查看包含已创建事件的系统表的内容,您可以使用ndb_select_all 实用程序,如下所示:

ndb_select_all -d sys 'NDB$EVENTS_0'

NdbEventOperation::clearError() (弃用)

描述

清除最近与此事件操作关联的错误。

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。

签名
void clearError
    (
      void
    )
参数

没有

返回值

没有

NdbEventOperation::执行()

描述

激活 NdbEventOperation,以便它可以开始接收事件。Ndb::nextEvent()在返回 以外的值后,可能会检索更改的属性值 NULL

在调用 之前,必须先调用getValue()getPreValue()getBlobValue()或 之一。 getPreBlobValue()execute()

在尝试使用此方法之前,您应该阅读 Ndb::nextEvent() (已弃用)NdbEventOperation::getValue()中提供的解释。另请参阅 第 2.3.16 节,“NdbEventOperation 类”

签名
int execute
    (
      void
    )
参数

没有

返回值

此方法0在成功和 -1失败时返回。

NdbEventOperation::getBlobHandle()

描述

此方法用于代替 getValue() blob 属性。此方法返回的 blob 句柄 ( NdbBlob) 仅支持读取操作。

要获取 blob 属性的先前值,请使用 getPreBlobHandle().

签名
NdbBlob* getBlobHandle
    (
      const char* name
    )
参数

nameblob 属性的 。

返回值

指向NdbBlob 对象的指针。

NdbEventOperation::getEpoch()

描述

获取检索到的最新事件数据的纪元。

在 NDB 7.4 中添加,此方法取代 getGCI()了现在已弃用并在未来的 NDB Cluster 版本中删除的方法。

签名
Uint64 getEpoch
  (
    void
  ) const
参数

没有

返回值

纪元号(整数)。

NdbEventOperation::getEventType() (弃用)

描述

此方法用于获取事件的类型 ( TableEvent)。

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中, getEventType2() 改为使用。

签名
NdbDictionary::Event::TableEvent getEventType
    (
      void
    ) const
参数

没有

返回值

一个TableEvent值。

NdbEventOperation::getEventType2()

描述

此方法用于获取事件的类型 ( TableEvent)。

在 NDB 7.4 中添加,此方法取代 getEventType()了现在已弃用并在未来的 NDB Cluster 版本中删除的方法。

签名
getEventType2
    (
      void
    ) const
参数

没有

返回值

一个TableEvent值。

NdbEventOperation::getGCI() (弃用)

描述

此方法检索最近检索到的事件的 GCI。

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中, getEpoch() 改为使用。

签名
Uint64 getGCI
    (
      void
    ) const
参数

没有

返回值

最近检索到的事件的全局检查点索引(整数)。

NdbEventOperation::getLatestGCI() (弃用)

描述

此方法检索最新的 GCI。

此方法返回最新的纪元号。

使用此方法获得的 GCI 不一定与事件相关联。

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中, Ndb::getHighestQueuedEpoch() 改为使用。

签名
Uint64 getLatestGCI
    (
      void
    ) const
参数

没有

返回值

最新的全局检查点的索引,一个整数。

NdbEventOperation::getNdbError() 函数

描述

此方法检索最近的错误。

签名
const struct NdbError& getNdbError
    (
      void
    ) const
参数

没有

返回值

NdbError 结构的引用。

NdbEventOperation::getPreBlobHandle()

描述

此函数与 相同 getBlobHandle(),只是它用于访问 blob 属性的先前值。请参阅 NdbEventOperation::getBlobHandle()

签名
NdbBlob* getPreBlobHandle
  (
    const char* name
  )
参数

nameblob 属性的 。

返回值

指向NdbBlob.

NdbEventOperation::getPreValue() 方法

描述

此方法的执行方式与 相同 getValue(),只是它用于定义属性的先前值而不是当前值的检索操作。

签名
NdbRecAttr* getPreValue
    (
      const char* name,
      char*       value = 0
    )
参数

此方法采用此处列出的两个参数:

  • 属性的name(作为常量字符指针)。

  • 指向 a 的指针value,这样:

    • 如果属性值不是 NULL,则在该参数中返回属性值。

    • 如果属性值为NULL,则属性值仅存储在 NdbRecAttr此方法返回的对象中。

    有关此参数的更多信息, 请参阅 value缓冲区内存分配。

返回值

保存属性值的NdbRecAttr对象,或 NULL指示发生错误的指针。

NdbEventOperation::getState() 方法

描述

此方法获取事件操作的当前状态。

签名
State getState
    (
      void
    )
参数

没有

返回值

一个State 值。

NdbEventOperation::getValue() 方法

描述

此方法定义属性值的检索。NDB API NdbRecAttr为要保存返回的属性值的对象分配内存。

此方法不数据库中获取属性值,并且 NdbRecAttr此方法返回的对象在调用此方法之前不可读或不可打印, execute() 并且Ndb::nextEvent() 已返回非NULL值。

如果一个特定的属性没有改变,相应的 NdbRecAttr将处于 state UNDEFINED。这可以通过使用NdbRecAttr::isNULL() which 在这种情况下返回来检查-1

getValue()检索当前值。用于 getPreValue() 检索以前的值。

签名
NdbRecAttr* getValue
    (
      const char* name,
      char*       value = 0
    )
参数

此方法采用此处列出的两个参数:

  • 属性的name(作为常量字符指针)。

  • 指向 a 的指针value,这样:

    • 如果属性值不是 NULL,则在该参数中返回属性值。

    • 如果属性值为NULL,则属性值仅存储在 NdbRecAttr此方法返回的对象中。

    有关此参数的更多信息, 请参阅 value缓冲区内存分配。

返回值

保存属性值的NdbRecAttr对象,或 NULL指示发生错误的指针。

value缓冲区内存分配。 value 缓冲区分配足够的内存是应用程序的责任(如果没有NULL),并且此缓冲区必须适当对齐。仅当缓冲区在 4 字节边界上对齐并且以字节为单位的属性大小(计算为 NdbRecAttr::get_size_in_bytes())是 4 的倍数时,才会直接使用缓冲区(从而避免复制惩罚)。

NdbEventOperation::hasError() (弃用)

描述

此方法用于确定是否存在与此事件操作关联的错误。

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中,用于 getEventType2() 确定事件类型。请参阅 事件::表事件

签名
int hasError
    (
      void
    ) const
参数

没有

返回值

如果发生事件丢失,则此方法返回 0;否则,它返回 1。

NdbEventOperation::isConsistent() (弃用)

描述

该方法用于判断节点故障后是否发生事件丢失。

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中,用于 getEventType2() 确定事件是否为 类型 TE_INCONSISTENT。请参阅 事件::表事件

签名
bool isConsistent
    (
      void
    ) const
参数

没有

返回值

如果发生事件丢失,则此方法返回 false;否则,它返回 true

NdbEventOperation::isEmptyEpoch()

描述

该方法用于判断消费的事件数据是否标记为空epoch。

NDB 7.4 中添加了此方法。

签名
bool isEmptyEpoch
    (
      void
    )
参数

没有

返回值

如果这个纪元为空,则该方法返回 true;否则,它返回 false

NdbEventOperation::isErrorEpoch()

描述

该方法用于判断消费的事件数据是否标记为空epoch。

NDB 7.4 中添加了此方法。

签名
bool isErrorEpoch
  (
    NdbDictionary::Event::TableEvent* error_type = 0
  )
参数

如果这是一个错误纪元,则 error_type包含与 TableEvent错误对应的值。

返回值

如果这个纪元有误,该方法返回 true;否则,它返回 false

NdbEventOperation::isOverrun()

描述

该方法用于判断是否由于缓冲区溢出导致事件丢失。

签名
bool isOverrun
    (
      void
    ) const
参数

没有

返回值

如果事件缓冲区已溢出,则此方法返回true,否则返回 false

NdbEventOperation::mergeEvents()

描述

此方法用于设置合并事件标志。有关事件合并的信息,请参阅 Event::mergeEvents()

合并事件标志是false默认的。

签名
void mergeEvents
    (
      bool flag
    )
参数

一个布尔值flag

返回值

没有

NdbEventOperation::状态

本节提供有关 State数据类型的信息。

描述

此类型描述事件操作的状态。

该方法返回一个StategetState()

枚举值

下表显示了可能的值以及说明:

表 2.42 NdbEventOperation 数据类型值和描述

姓名 描述
EO_CREATED 事件操作已创建,但execute() 尚未调用。
EO_EXECUTING execute()已为此事件操作调用该方法。
EO_DROPPED 事件操作正在等待删除,不再可用。
EO_ERROR 发生错误,事件操作不可用。

NdbEventOperation::tableFragmentationChanged()

描述

此方法用于测试表的碎片是否已随 TE_ALTER事件发生变化。(请参阅 事件::TableEvent。)

签名
bool tableFragmentationChanged
    (
      void
    ) const
参数

没有

返回值

true如果表的碎片已更改,则 返回;否则,该方法返回 false

NdbEventOperation::tableFrmChanged()

描述

使用此方法可确定表 .FRM文件是否因事件而更改TE_ALTER。(请参阅 事件::TableEvent。)

签名
bool tableFrmChanged
    (
      void
    ) const
参数

没有

返回值

true如果表 .FRM文件已更改则 返回;否则,该方法返回false

NdbEventOperation::tableNameChanged()

描述

此方法测试表名是否因TE_ALTER表事件而更改。(请参阅 事件::TableEvent。)

签名
bool tableNameChanged
    (
      void
    ) const
参数

没有

返回值

true如果表的名称已更改,则 返回;否则,该方法返回 false

NdbEventOperation::tableRangeListChanged()

描述

使用此方法检查表范围分区列表名称是否已随 TE_ALTER事件发生更改。

签名
bool tableRangeListChanged
    (
      void
    ) const
参数

没有

返回值

true如果范围或列表分区名称已更改,则 此方法返回;否则返回 false