文档首页
MySQL NDB Cluster API 开发者指南
相关文档 下载本手册
PDF (US Ltr) - 3.6Mb
PDF (A4) - 3.6Mb


2.3.5 事件类

本节提供有关 Event 类的信息。

事件类概述

父类

NdbDictionary

子类

描述

此类表示 NDB Cluster 中的数据库事件。

方法

下表列出了 Event 类 的公共方法,以及每个方法的用途或作用

表 2.14 Event 类方法及其描述

名称 描述
Event() 类构造函数
~Event() 析构函数
addEventColumn() 添加应检测事件的列
addEventColumns() 添加应检测事件的多个列
addTableEvent() 添加应检测的事件类型
getDurability() 获取事件的持久性
getEventColumn() 获取定义了事件的列
getName() 获取事件的名称
getNoOfEventColumns() 获取定义了事件的列数
getObjectId() 获取事件的对象 ID
getObjectStatus() 获取事件的对象状态
getObjectVersion() 获取事件的对象版本
getReport() 获取事件的报告选项
getTable() 获取定义了事件的 Table 对象
getTableEvent() 检查是否要检测事件
getTableName() 获取定义了事件的表的名称
mergeEvents() 设置事件的合并标志
setDurability() 设置事件的持久性
setName() 设置事件的名称
setReport() 设置事件的报告选项
setTable() 设置定义了事件的 Table 对象

改进的事件 API (NDB 7.4 及更高版本)。  NDB 7.4 引入了一个基于纪元的事件 API,它取代了早期的基于 GCI 的模型。新版本的 API 还简化了错误检测和处理。这些更改在 NDB API 中通过为 NdbNdbEventOperation 实现了许多新方法,弃用这两个类中的其他一些方法,以及向 TableEvent 添加新的类型值而实现。

一些新方法直接替换或替代已弃用的方法,但并非所有已弃用的方法都映射到新的方法,其中一些是全新的。旧的(已弃用的)方法显示在下表的第 1 列,新的方法显示在第 2 列;与新方法对应的旧方法显示在同一行。


使用新 API 处理错误是通过检查从 getEventType2() 返回的值来完成的,不再使用 hasError()clearError() 方法来处理,这些方法现在已弃用,并在 NDB Cluster 的未来版本中可能会被移除。为了支持此更改,TableEvent 类型的可能范围已通过此处列出的内容进行了扩展

  • TE_EMPTY: 空纪元

  • TE_INCONSISTENT: 不一致的纪元;缺少数据或溢出

  • TE_OUT_OF_MEMORY: 不一致的数据;事件缓冲区内存不足或溢出

这些更改的结果是,在 NDB 7.4 及更高版本中,您可以在检查表事件的类型时检查错误,如下所示

NdbDictionary::Event::TableEvent* error_type = 0;
NdbEventOperation* pOp = nextEvent2();

if (pOp->isErrorEpoch(error_type)
{
  switch (error_type)
  {
    case TE_INCONSISTENT :
      // Handle error/inconsistent epoch...
      break;

    case TE_OUT_OF_MEMORY :
      // Handle error/inconsistent data...
      break;

    //  ...
  }
}

有关更多信息,请参阅之前表格中显示的 NdbNdbEventOperation 方法的详细说明,以及 Event::TableEvent

类型

这些是 Event 类 的公共类型

表 2.16 Event 类类型及其描述

名称 描述
TableEvent() 表示表事件的类型
EventDurability() 指定事件的范围、可访问性和生存期
EventReport() 指定表事件的报告选项

Event::addEventColumn()

描述

此方法用于添加应检测事件的列。可以使用列的 ID 或名称来标识该列。

您必须先调用 Dictionary::createEvent(),然后才会检测到任何错误。请参阅 Dictionary::createEvent()

如果您知道几个列的名称,则可以使用 addEventColumns() 在一次操作中启用对所有列的事件检测。请参阅 Event::addEventColumns()

签名

此方法可以通过以下两种方式之一调用

  • 使用列 ID 标识事件

    void addEventColumn
        (
          unsigned attrId
        )
  • 按名称标识列

    void addEventColumn
        (
          const char* columnName
        )
参数

此方法接受一个参数,该参数可以是以下任一参数

  • 列 ID (attrId),它应该是一个大于或等于 0 的整数,并且小于 getNoOfEventColumns() 返回的值。

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

返回值

.

Event::addEventColumns()

描述

此方法用于在一次操作中启用对几个列的事件检测。您必须使用列的名称。

addEventColumn() 相似,必须先调用 Dictionary::createEvent(),才能检测到任何错误。请参阅 Dictionary::createEvent()

签名
void addEventColumns
    (
      int          n,
      const char** columnNames
    )
参数

此方法需要以下两个参数

  • 列数 n(整数)。

  • 列名称 columnNames — 此参数必须以指向字符指针的形式传递。

返回值

.

Event::addTableEvent()

描述

此方法用于添加要检测的事件类型。

签名
void addTableEvent
    (
      const TableEvent te
    )
参数

此方法需要一个 TableEvent 值。

返回值

.

Event 构造函数

描述

The Event 构造函数使用给定的名称创建一个新实例,并可选择将其与一个表关联。

请注意,NDB API 不会跟踪分配的事件对象,这意味着用户必须在不再使用 Event 后显式地删除它。

签名

可以使用两种方法调用此方法,第一种方法仅使用名称,如下所示

Event
    (
      const char* name
    )

或者,可以使用事件名称和关联的表,如下所示

Event
    (
      const char*                  name,
      const NdbDictionary::Table& table
    )
参数

至少需要一个事件的 name(作为常量字符指针)。可选地,事件还可以与一个表关联;当存在此参数时,它是一个指向 Table 对象的引用(请参阅 第 2.3.27 节,“表类”)。

返回值

一个新的 Event 实例。

析构函数。 此类的析构函数作为虚方法提供,它不接受任何参数,其返回类型为 void

Event::EventDurability

本节提供有关 EventDurability 的信息,它是 Event 类定义的类型。

描述

此类型的值用于描述事件的生命周期或持久性及其范围。

枚举值

下表显示了可能的值及其描述

表 2.17 Event::EventDurability 数据类型的值和描述

名称 描述
ED_UNDEFINED 事件未定义或类型不受支持。
ED_SESSION 此事件仅在当前会话期间持续存在,并且仅对当前应用程序可用。在应用程序断开连接或集群重新启动后,它将被删除。
重要

ED_SESSION 预留供将来使用,目前在任何 NDB Cluster 版本中都不支持。

ED_TEMPORARY 任何应用程序都可以使用此事件,但在集群重新启动后,它将被删除。
重要

ED_TEMPORARY 预留供将来使用,目前在任何 NDB Cluster 版本中都不支持。

ED_PERMANENT 任何应用程序都可以使用此事件,它将持续存在,直到应用程序将其删除(即使在集群重新启动后也是如此)。
重要

ED_PERMANENT 预留供将来使用,目前在任何 NDB Cluster 版本中都不支持。


Event::EventReport

本节提供有关 EventReport 的信息,它是 Event 类定义的类型。

描述

此类型的值用于指定表事件的报告选项。

枚举值

下表显示了可能的值及其描述

表 2.18 Event::EventReport 类型的值和描述

名称 描述
ER_UPDATED 报告更新事件
ER_ALL 报告所有事件,除了不会导致对 blob 列的内联部分进行任何更新的事件之外
ER_SUBSCRIBE 报告订阅事件
ER_DDL 报告 DDL 事件(请参阅 Event::setReport(),了解更多信息)

Event::getDurability()

描述

此方法获取事件的生命周期和范围(即其 EventDurability)。

签名
EventDurability getDurability
    (
      void
    ) const
参数

.

返回值

一个 EventDurability 值。

Event::getEventColumn()

描述

此方法用于从定义了事件的列中获取特定列。

签名
const Column* getEventColumn
    (
      unsigned no
    ) const
参数

列号 (no),通过使用 getNoOfColumns() 获取(请参阅 Event::getNoOfEventColumns())。

返回值

指向与 no 相对应的 Column 的指针。

Event::getName()

描述

此方法获取事件的名称。

签名
const char* getName
    (
      void
    ) const
参数

.

返回值

事件的名称,作为字符指针。

Event::getNoOfEventColumns()

描述

此方法获取定义了事件的列数。

签名
int getNoOfEventColumns
    (
      void
    ) const
参数

.

返回值

列数(作为整数),或在发生错误时为 -1

Event::getObjectStatus()

描述

此方法获取事件的对象状态。

签名
virtual Object::Status getObjectStatus
    (
      void
    ) const
参数

.

返回值

事件的对象状态。有关可能的值,请参阅 Object::Status

Event::getObjectVersion()

描述

此方法获取事件的对象版本(请参阅 NDB 架构对象版本)。

签名
virtual int getObjectVersion
    (
      void
    ) const
参数

.

返回值

事件的对象版本,作为整数。

Event::getObjectId()

描述

此方法检索事件的对象 ID。

签名
virtual int getObjectId
    (
      void
    ) const
参数

.

返回值

事件的对象 ID,作为整数。

Event::getReport()

描述

此方法用于获取对该事件生效的报告选项。

签名
EventReport getReport
    (
      void
    ) const
参数

.

返回值

Event::EventReport 中指定的报告选项之一。

Event::getTable()

描述

此方法用于查找与事件关联的表。它返回指向相应 Table 对象的引用。您还可以使用 getTableName() 直接获取表的名称。

签名
const NdbDictionary::Table* getTable
    (
      void
    ) const
参数

.

返回值

与事件关联的表(如果有)作为指向 Table 对象的指针;否则,此方法将返回 NULL。(请参阅 第 2.3.27 节,“表类”。)

Event::getTableEvent()

描述

此方法用于检查是否将检测到给定的表事件。

签名
bool getTableEvent
    (
      const TableEvent te
    ) const
参数

此方法接受一个参数,即表事件的类型,即 TableEvent 值。

返回值

如果将检测到 TableEvent 类型为 te 的事件,则此方法返回 true。否则,返回值为 false

Event::getTableName()

描述

此方法获取与事件关联的表的名称,可以作为 getTable() 的便捷替代方法。(请参阅 Event::getTable()。)

签名
const char* getTableName
    (
      void
    ) const
参数

.

返回值

与该事件关联的表的名称,作为字符指针。

Event::mergeEvents()

描述

此方法用于设置 合并事件标志,该标志默认情况下为 false。将其设置为 true 意味着事件将按如下方式合并

  • 对于与该事件关联的给定 NdbEventOperation,在同一全局检查点索引(GCI)内具有相同主键的事件将合并为单个事件。

  • 将为每个 blob 属性创建一个 blob 表事件,并且 blob 事件将作为主表事件的一部分进行处理。

  • blob 部分事件的 blob 前/后数据可以通过 NdbBlob 方法以单个值的形式读取。

    此标志不会被 NdbEventOperation 继承,必须在 NdbEventOperation 上显式地设置它。

签名
void mergeEvents
    (
      bool flag
    )
参数

一个布尔 flag 值。

返回值

.

Event::setDurability()

描述

此方法设置事件的持久性,即其生命周期和范围。

签名
void setDurability(EventDurability ed)
参数

此方法需要一个 EventDurability 值作为参数。

返回值

.

Event::setReport()

描述

此方法用于设置事件的报告选项。可能的值可以在 Event::EventReport 中找到。

报告 DDL 事件

您必须使用 EventReportER_DDL(在同一 NDB Cluster 版本中添加)调用 setReport()

例如,要启用对名为 myEventEvent 对象的 DDL 事件报告,您必须按如下所示调用此方法

myEvent.setReport(NdbDictionary::Event::ER_DDL);
签名
void setReport
    (
      EventReport er
    )
参数

一个 EventReport 选项值。

返回值

.

Event::setName()

描述

此方法用于设置事件的名称。名称在从当前应用程序可见的所有事件中必须是唯一的(请参阅 Event::getDurability())。

您还可以首次创建事件时设置事件的名称。请参阅 Event 构造函数

签名
void setName
    (
      const char* name
    )
参数

要赋予事件的 name(作为常量字符指针)。

返回值

.

Event::setTable()

描述

此方法定义要检测事件的表。

默认情况下,事件检测在表中的所有列上进行。使用 addEventColumn() 覆盖此行为。有关详细信息,请参阅 Event::addEventColumn()

签名
void setTable
    (
      const NdbDictionary::Table& table
    )

您还可以使用此方法中的指针,如下所示

void setTable
    (
      const NdbDictionary::Table*; table
    )

当这样使用时,此版本的 setTable() 将在表指针为 NULL 时返回 -1。

参数

此方法需要一个参数,即要检测事件的表的引用或指针(请参阅 第 2.3.27 节,“表类”)。

返回值

如果使用了空表指针,则为 -1,否则为 null。

Event::TableEvent

本节介绍 TableEvent,它是 Event 类定义的类型。

描述

TableEvent 用于对可能与 NDB API 中的表关联的事件类型进行分类。

枚举值

下表显示了可能的值及其描述

表 2.19 Event::TableEvent 类型的值和描述

名称 描述
TE_INSERT 表上的插入事件
TE_DELETE 表上的删除事件
TE_UPDATE 表上的更新事件
TE_DROP 在删除表时发生
TE_ALTER 在更改表定义时发生
TE_CREATE 在创建表时发生
TE_GCP_COMPLETE 在完成全局检查点时发生
TE_CLUSTER_FAILURE 在集群故障时发生
TE_STOP 在停止事件操作时发生
TE_NODE_FAILURE 当集群节点故障时发生
TE_SUBSCRIBE 当集群节点订阅事件时发生
TE_UNSUBSCRIBE 当集群节点取消订阅事件时发生
TE_EMPTY 从数据节点接收到的空纪元
TE_INCONSISTENT 数据节点丢失数据或缓冲区溢出
TE_OUT_OF_MEMORY 事件缓冲区溢出
TE_ALL 当表上发生任何事件时发生(接收特定事件时不相关)

TE_EMPTYTE_INCONSISTENTTE_OUT_OF_MEMORY 在 NDB 7.4 中添加。