本节提供有关 NdbEventOperation
类的信息,该类用于监视数据库中的更改(事件)。它提供了用于实现 NDB Cluster 复制的核心功能。
- 父类
无
- 子类
无
- 描述
NdbEventOperation
表示数据库事件。- 方法
-
下表列出了此类的公共方法以及每个方法的用途或用法
表 2.42 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
的实例是作为对 Ndb
和 NdbDictionary
对象的方法调用的结果创建的,但须满足以下条件
必须存在使用
Dictionary::createEvent()
创建的事件。此方法返回Event
类的一个实例。使用
Ndb::createEventOperation()
实例化NdbEventOperation
对象,该对象作用于Event
的实例。
通过调用 Ndb::dropEventOperation
移除此类的实例。
第 2.5.9 节“NDB API 事件处理示例” 中提供了一个详细的示例,演示了如何创建和移除事件操作。
已知问题。 在 NDB API 中使用事件操作时,可能会遇到以下问题
活动
NdbEventOperation
对象的最大数量目前在编译时固定为 2 *MaxNoOfTables
。-
目前,所有
INSERT
、DELETE
和UPDATE
事件(以及所有属性更改)都会发送到 API,即使只指定了某些属性也是如此。但是,这些对用户是隐藏的,并且在调用Ndb::nextEvent()
后仅显示相关数据。请注意,可能会发生从
Ndb::pollEvents()
的错误退出,因此以下nextEvent()
调用将返回零,因为没有可用数据。在这种情况下,只需再次调用pollEvents()
即可。 事件代码不检查表架构版本。删除表时,请确保删除所有关联的事件。
-
如果您已收到完整的纪元,则不会重新发送此纪元中的事件,即使发生节点故障也是如此。但是,如果发生了节点故障,则后续纪元可能包含重复的事件,可以通过重复的主键来识别这些事件。
在 NDB Cluster 复制代码中,
INSERT
操作中的重复主键通常通过将此类插入视为REPLACE
操作来处理。
- 描述
-
清除最近与此事件操作关联的错误。
此方法已弃用,将在以后的版本中删除。从 NDB 8.4.0 开始,它不执行任何操作。
- 签名
void clearError ( void )
- 参数
无.
- 返回值
无.
- 描述
-
激活
NdbEventOperation
,使其可以开始接收事件。在Ndb::nextEvent()
返回非NULL
值后,可以检索已更改的属性值。在调用
execute()
之前,必须先调用getValue()
、getPreValue()
、getBlobValue()
或getPreBlobValue()
之一。在尝试使用此方法之前,您应该阅读 Ndb::nextEvent() (已弃用) 和 NdbEventOperation::getValue() 中提供的说明。另请参见 第 2.3.16 节 “NdbEventOperation 类”。
- 签名
int execute ( void )
- 参数
无.
- 返回值
此方法成功时返回
0
,失败时返回-1
。
- 描述
-
此方法用于代替
getValue()
处理 blob 属性。此方法返回的 blob 句柄 (NdbBlob
) 仅支持读取操作。要获取 blob 属性的先前值,请使用
getPreBlobHandle()
。 - 签名
NdbBlob* getBlobHandle ( const char* name )
- 参数
blob 属性的
名称
。- 返回值
指向
NdbBlob
对象的指针。
- 描述
-
获取检索到的最新事件数据的纪元。
此方法在 NDB 7.4 中添加,取代了
getGCI()
,后者现已弃用,并将在未来的 NDB Cluster 版本中删除。 - 签名
Uint64 getEpoch ( void ) const
- 参数
无.
- 返回值
纪元号(整数)。
- 描述
-
此方法用于获取事件的类型 (
TableEvent
)。此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请改用
getEventType2()
。 - 签名
NdbDictionary::Event::TableEvent getEventType ( void ) const
- 参数
无.
- 返回值
TableEvent
值。
- 描述
-
此方法用于获取事件的类型 (
TableEvent
)。此方法在 NDB 7.4 中添加,取代了
getEventType()
,后者现已弃用,并将在未来的 NDB Cluster 版本中删除。 - 签名
getEventType2 ( void ) const
- 参数
无.
- 返回值
TableEvent
值。
- 描述
-
此方法检索最近检索到的事件的 GCI。
此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请改用
getEpoch()
。 - 签名
Uint64 getGCI ( void ) const
- 参数
无.
- 返回值
最近检索到的事件的全局检查点索引(整数)。
- 描述
-
此方法检索最新的 GCI。
此方法返回最新的纪元号。
使用此方法获取的 GCI 不一定与事件相关联。
此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请改用
Ndb::getHighestQueuedEpoch()
。 - 签名
Uint64 getLatestGCI ( void ) const
- 参数
无.
- 返回值
最新全局检查点的索引,一个整数。
- 描述
此函数与
getBlobHandle()
相同,但用于访问 blob 属性的先前值。请参见 NdbEventOperation::getBlobHandle()。- 签名
NdbBlob* getPreBlobHandle ( const char* name )
- 参数
blob 属性的
名称
。- 返回值
指向
NdbBlob
的指针。
- 描述
此方法的功能与
getValue()
相同,但用于定义检索属性先前值的操作,而不是当前值。- 签名
NdbRecAttr* getPreValue ( const char* name, char* value = 0 )
- 参数
-
此方法采用此处列出的两个参数
属性的
名称
(作为常量字符指针)。-
指向
值
的指针,以便如果属性值不是
NULL
,则在此参数中返回属性值。如果属性值为
NULL
,则属性值仅存储在此方法返回的NdbRecAttr
对象中。
有关此参数的更多信息,请参见
值
缓冲区内存分配。
- 返回值
一个
NdbRecAttr
对象,用于保存属性的值,或者是一个NULL
指针,指示发生了错误。
- 描述
-
此方法定义属性值的检索。NDB API 为要保存返回的属性值的
NdbRecAttr
对象分配内存。此方法 不 从数据库中获取属性值,并且在此方法返回的
NdbRecAttr
对象上调用execute()
方法并且Ndb::nextEvent()
返回非NULL
值之前,该对象是不可读或不可打印的。如果特定属性未更改,则相应的
NdbRecAttr
将处于UNDEFINED
状态。可以使用NdbRecAttr::isNULL()
进行检查,在这种情况下,该方法返回-1
。getValue()
检索当前值。使用getPreValue()
检索先前值。 - 签名
NdbRecAttr* getValue ( const char* name, char* value = 0 )
- 参数
-
此方法采用此处列出的两个参数
属性的
名称
(作为常量字符指针)。-
指向
值
的指针,以便如果属性值不是
NULL
,则在此参数中返回属性值。如果属性值为
NULL
,则属性值仅存储在此方法返回的NdbRecAttr
对象中。
有关此参数的更多信息,请参见
值
缓冲区内存分配。
- 返回值
一个
NdbRecAttr
对象,用于保存属性的值,或者是一个NULL
指针,指示发生了错误。
值
缓冲区内存分配。 应用程序负责为 值
缓冲区分配足够的内存(如果不是 NULL
),并且必须正确对齐此缓冲区。仅当缓冲区在 4 字节边界上对齐并且以字节为单位的属性大小(计算方式为 NdbRecAttr::get_size_in_bytes()
)是 4 的倍数时,才会直接使用该缓冲区(从而避免了复制损失)。
- 描述
-
此方法用于确定是否存在与此事件操作关联的错误。
此方法已弃用,并将在未来的版本中删除。在 NDB 8.4 及更高版本中,它返回一个常量。请改用
getEventType2()
来确定事件类型。请参见 Event::TableEvent。 - 签名
int hasError ( void ) const
- 参数
无.
- 返回值
-
NDB 8.3 及更早版本:如果发生了事件丢失,则此方法返回 0;否则,它返回 1。
NDB 8.4 及更高版本:始终返回
0
。
- 描述
-
此方法用于确定在节点发生故障后是否发生了事件丢失。
此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请使用
getEventType2()
来确定事件的类型是否为TE_INCONSISTENT
。请参见 Event::TableEvent。 - 签名
bool isConsistent ( void ) const
- 参数
无.
- 返回值
如果发生了事件丢失,则此方法返回
false
;否则,它返回true
。
- 描述
-
此方法用于确定消耗的事件数据是否标记为空纪元。
此方法在 NDB 7.4 中添加。
- 签名
bool isEmptyEpoch ( void )
- 参数
无.
- 返回值
如果此纪元为空,则该方法返回
true
;否则,它返回false
。
- 描述
-
此方法用于确定消耗的事件数据是否标记为空纪元。
此方法在 NDB 7.4 中添加。
- 签名
bool isErrorEpoch ( NdbDictionary::Event::TableEvent* error_type = 0 )
- 参数
如果这是一个错误纪元,则
error_type
包含与该错误相对应的TableEvent
值。- 返回值
如果此纪元出错,则该方法返回
true
;否则,它返回false
。
- 描述
此方法用于确定是否由于缓冲区溢出而发生了事件丢失。
- 签名
bool isOverrun ( void ) const
- 参数
无.
- 返回值
如果事件缓冲区已溢出,则此方法返回
true
,否则返回false
。
- 描述
-
此方法用于设置合并事件标志。有关事件合并的信息,请参见 Event::mergeEvents()。
默认情况下,合并事件标志为
false
。 - 签名
void mergeEvents ( bool flag )
- 参数
布尔值
标志
。- 返回值
无.
本节提供有关 State
数据类型的信息。
- 描述
-
此类型描述事件操作的状态。
getState()
方法返回State
值。 - 枚举值
-
下表显示了可能的值及其说明
表 2.43 NdbEventOperation 数据类型值和说明
名称 描述 EO_CREATED
事件操作已创建,但尚未调用 execute()
。EO_EXECUTING
已为此事件操作调用了 execute()
方法。EO_DROPPED
事件操作正在等待删除,并且不再可用。 EO_ERROR
发生了错误,并且事件操作不可用。
- 描述
此方法用于测试表的碎片是否已在与
TE_ALTER
事件相关的连接中更改。(请参见 Event::TableEvent。)- 签名
bool tableFragmentationChanged ( void ) const
- 参数
无.
- 返回值
如果表的碎片已更改,则返回
true
;否则,该方法返回false
。
- 描述
使用此方法确定表
.FRM
文件是否已在与TE_ALTER
事件相关的连接中更改。(请参见 Event::TableEvent。)- 签名
bool tableFrmChanged ( void ) const
- 参数
无.
- 返回值
如果表
.FRM
文件已更改,则返回true
;否则,该方法返回false
。
- 描述
此方法测试在
TE_ALTER
表事件之后,表名是否已更改。(请参阅 Event::TableEvent。)- 签名
bool tableNameChanged ( void ) const
- 参数
无.
- 返回值
如果表名已更改,则返回
true
;否则,该方法返回false
。