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


2.3.11 Ndb 类

本节介绍 Ndb 类,它模拟 NDB 内核;它是 NDB API 的主要类。

Ndb 类概述

父类

子类

描述

任何重要的 NDB API 程序都至少使用一个 Ndb 实例。通过使用多个 Ndb 对象,可以实现多线程应用程序。您应该记住,一个 Ndb 对象不能在多个线程之间共享;但是,单个线程可以使用多个 Ndb 对象。单个应用程序进程最多支持 4711 个 Ndb 对象。

方法

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

表 2.26 Ndb 类方法和描述

名称 描述
Ndb() 类构造函数;表示与 NDB 集群的连接。
~Ndb() 类析构函数;当不再使用集群连接时,终止连接
closeTransaction() 关闭事务。
computeHash() 计算分配哈希值。
createEventOperation() 创建对数据库事件的订阅。(请参见 第 2.3.16 节,“NdbEventOperation 类”。)
dropEventOperation() 取消订阅数据库事件。
getDictionary() 获取字典,用于处理数据库模式信息。
getDatabaseName() 获取当前数据库的名称。
getDatabaseSchemaName() 获取当前数据库模式的名称。
get_eventbuf_max_alloc() 获取事件缓冲区的当前分配最大大小。
get_eventbuffer_free_percent() 获取事件缓冲区内存应在达到限制后恢复缓冲之前可用的百分比。在 NDB 7.4 中添加。
get_event_buffer_memory_usage() 提供事件缓冲区内存使用情况信息。在 NDB 7.4 中添加。
getGCIEventOperations() 从 GCI 获取下一个事件操作。在 NDB 7.4 中已弃用。
getHighestQueuedEpoch() 获取事件队列中的最新纪元。在 NDB 7.4 中添加。
getLatestGCI() 获取最新的 GCI。在 NDB 7.4 中已弃用。
getNdbError() 检索错误。(请参见 第 2.3.15 节,“NdbError 结构”。)
getNdbErrorDetail() 检索额外的错误详细信息。
getNdbObjectName() 如果设置了 Ndb 对象名称,则检索该名称。
getNextEventOpInEpoch2() 获取此全局检查点中的下一个事件操作。
getNextEventOpInEpoch3() 获取此全局检查点中的下一个事件操作,显示任何接收到的任何值。在 NDB 7.4.18 和 7.5.9 中添加。
getReference() 检索 Ndb 对象实例的引用或标识符。
init() 初始化 Ndb 对象并使其准备就绪。
isConsistent() 所有接收到的事件是否一致。在 NDB 7.4 中已弃用。
isConsistentGCI() 给定全局检查点的所有接收到的事件是否一致。在 NDB 7.4 中已弃用。
isExpectingHigherQueuedEpochs() 检查是否有新的排队纪元,或者是否有集群故障事件。在 NDB 7.4.7 中添加。
nextEvent() 从队列获取下一个事件。在 NDB 7.4 中已弃用。
nextEvent2() 从队列获取下一个事件。在 NDB 7.4 中添加。
pollEvents() 等待事件发生。在 NDB 7.4 中已弃用。
pollEvents2() 等待事件发生。在 NDB 7.4 中添加。
setDatabaseName() 设置当前数据库的名称。
setDatabaseSchemaName() 设置当前数据库模式的名称。
setEventBufferQueueEmptyEpoch() 启用空事件的排队。在 NDB 7.4.11 中添加。
set_eventbuf_max_alloc() 设置事件缓冲区的当前分配最大大小。
set_eventbuffer_free_percent() 设置事件缓冲区内存应在达到限制后恢复缓冲之前可用的百分比。在 NDB 7.4 中添加。
setNdbObjectName() 出于调试目的:为此 Ndb 对象设置任意名称。
startTransaction() 开始一个事务。(请参见 第 2.3.25 节,“NdbTransaction 类”。)

类型

Ndb 类不定义任何公共类型,但定义了三个数据结构,列出如下

Ndb 对象的资源消耗。 Ndb 对象消耗的内存与对象生命周期内执行的最大操作的大小成正比。这在大型事务、使用 blob 列或同时使用这两种情况下尤为明显。此内存将保留在对象的整个生命周期内,一旦 Ndb 对象以这种方式使用该内存,则释放此内存的唯一方法是销毁该对象(然后根据需要创建新的实例)。

注意

Ndb 对象是多线程安全的,因为每个 Ndb 对象一次只能由一个线程处理。如果将 Ndb 对象传递给另一个线程,那么应用程序必须确保使用内存屏障以确保新线程看到先前线程执行的所有更新。

信号量和互斥锁是无需理会内存屏障概念就能轻松提供内存屏障的示例。

还可以使用多个 Ndb 对象在单个应用程序中对不同集群执行操作。请参见 第 1.5 节,“应用程序级分区”,了解适用于此类用法的条件和限制。

Ndb 类构造函数

描述

这将创建一个 Ndb 实例,它代表与 NDB 集群的连接。所有 NDB API 应用程序都应从创建至少一个 Ndb 对象开始。这需要创建至少一个 Ndb_cluster_connection 实例,它充当集群连接字符串的容器。

签名
Ndb
    (
      Ndb_cluster_connection* ndb_cluster_connection,
      const char*                    catalogName = "",
      const char*                    schemaName = "def"
    )
参数

Ndb 类构造函数最多可以接受 3 个参数,其中只有第一个是必需的

  • ndb_cluster_connection 是一个 Ndb_cluster_connection 实例,它代表一个集群连接字符串。(见 第 2.3.12 节,“Ndb_cluster_connection 类”。)

  • catalogName 是一个可选参数,它为从 Ndb 对象建立的任何连接中创建的表和索引提供命名空间。

    这等同于 mysqld 所认为的 数据库

    此参数的默认值为一个空字符串。

  • 可选的 schemaName 为在给定目录中创建的表和索引提供了额外的命名空间。

    此参数的默认值为字符串 def

返回值

一个 Ndb 对象。

析构函数

应调用 Ndb 类的析构函数以终止 Ndb 实例。它不需要任何参数,也不需要任何特殊处理。

Ndb::closeTransaction()

描述

这是 NDB API 提供的用于关闭事务的两种方法之一(另一种是 NdbTransaction::close())。您必须在事务完成后调用这两个方法中的一个以关闭事务,无论事务是否成功。

如果事务尚未提交,则在调用此方法时会中止事务。见 Ndb::startTransaction()

签名
void closeTransaction
    (
      NdbTransaction *transaction
    )
参数

此方法接受一个参数,一个指向要关闭的 NdbTransaction 的指针。

返回值

(void)。

Ndb::computeHash()

描述

此方法可用于计算分布哈希值,给定一个表及其键。

computeHash() 只能用于使用原生 NDB 分区的表。

签名
static int computeHash
    (
      Uint32*                     hashvalueptr,
      const NdbDictionary::Table* table,
      const struct Key_part_ptr*  keyData,
      void*                       xfrmbuf = 0,
      Uint32                      xfrmbuflen = 0
    )
参数

此方法采用以下参数

  • 如果方法调用成功,则 hashvalueptr 将被设置为计算出的哈希值。

  • 指向一个 table 的指针(见 第 2.3.27 节,“Table 类”)。

  • keyData 是一个指向作为表分配键一部分的键部分的指针的空终止数组。每个键部分的长度从元数据中读取,并与传递的值进行检查(见 Ndb::Key_part_ptr)。

  • xfrmbuf 是指向用于计算哈希值的临时缓冲区的指针。

  • xfrmbuflen 是此缓冲区的长度。

    如果 xfrmbufNULL(默认值),则会根据需要自动调用 malloc()free()

    NDB 7.5.30 之前,7.6.26 之前,8.0.33 之前: 如果 xfrmbuf 不为 NULLxfrmbuflen 太小,则 computeHash() 失败。

    NDB 7.5.30 及更高版本,7.6.26 及更高版本,8.0.33 及更高版本: 如果传递的缓冲区大小不足,则会自动分配临时缓冲区。(错误 #103814、错误 #32959894)

    注意

    malloc() 为此方法提供缓冲区时,会在分配缓冲区后,在实际使用之前,对缓冲区进行显式对齐。(错误 #16484617)

返回值

成功时为 0,失败时为错误代码。如果方法调用成功,则可以通过 hashvalueptr 获得计算出的哈希值。

Ndb::createEventOperation()

描述

此方法创建一个对数据库事件的订阅。

NDB API 事件订阅在使用 ndb_restore 恢复 NDB 集群后不会持久存在;在这种情况下,必须显式重新创建所有订阅。

签名
NdbEventOperation* createEventOperation
    (
      const char *eventName
    )
参数

此方法接受一个参数,即标识您要订阅的事件的唯一 eventName

返回值

指向一个 NdbEventOperation 对象的指针(或 NULL,如果失败)。见 第 2.3.16 节,“NdbEventOperation 类”

Ndb::dropEventOperation()

描述

此方法删除由 NdbEventOperation 对象表示的对数据库事件的订阅。

已删除的事件操作使用的内存不会在事件缓冲区完全读取之前释放。这意味着您必须继续调用 pollEvents()nextEvent(),直到这些方法分别返回 0NULL,以便释放此内存。

签名
int dropEventOperation
    (
      NdbEventOperation *eventOp
    )
参数

此方法需要一个输入参数,一个指向 NdbEventOperation 实例的指针。

返回值

0 表示成功;任何其他结果都表示失败。

Ndb::EventBufferMemoryUsage

本节介绍 EventBufferMemoryUsage 结构。

父类

Ndb

描述

此结构是在 NDB 7.4 中添加的,用于处理事件缓冲区内存使用统计信息。它用作 Ndb::get_event_buffer_memory_usage() 的参数。

属性

EventBufferMemoryUsage 具有下表所示的属性

表 2.27 事件缓冲区内存使用结构属性,包含类型、初始值和描述

名称 类型 初始值 描述
allocated_bytes 无符号 分配的总事件缓冲区内存,以字节为单位
used_bytes 无符号 使用的总内存,以字节为单位
usage_percent 无符号 事件缓冲区内存使用率,以百分比表示 (100 * used_bytes / allocated_bytes)

Ndb::getDictionary()

描述

此方法用于获取一个对象,用于检索或操作数据库模式信息。这个 Dictionary 对象包含有关集群中所有表的元信息。

此方法返回的字典独立于任何事务运行。见 第 2.3.3 节,“Dictionary 类”,以获取更多信息。

签名
NdbDictionary::Dictionary* getDictionary
    (
      void
    ) const
参数

.

返回值

一个 Dictionary 类实例。

Ndb::getDatabaseName()

描述

此方法可用于获取当前数据库的名称。

签名
const char* getDatabaseName
    (
      void
    )
参数

无。

返回值

当前数据库的名称。

Ndb::getDatabaseSchemaName()

描述

此方法可用于获取当前数据库模式的名称。

签名
const char* getDatabaseSchemaName
    (
      void
    )
参数

.

返回值

当前数据库模式的名称。

Ndb::getGCIEventOperations() (已弃用)

描述

迭代当前 GCI 中包含的各个事件操作,在调用 nextEvent() 后变得有效。您可以使用此方法在处理事件数据之前获取纪元摘要信息(例如,所有表的列表)。

此方法已弃用,并且可能会在未来的版本中删除。在可能的情况下,请使用 getNextEventOpInEpoch2() 代替。

签名
const NdbEventOperation* getGCIEventOperations
    (
      Uint32* iter,
      Uint32* event_types
    )
参数

一个迭代器和一个事件类型掩码。将 *iter=0 设置为开始。

返回值

下一个事件操作;当没有更多事件操作时返回 NULL。如果 event_types 不为 NULL,则在调用该方法后,它将包含收到的事件类型的位掩码。。

Ndb::get_eventbuf_max_alloc()

描述

获取可用于事件缓冲区的最大内存(以字节为单位)。这与在 MySQL Server 中读取 ndb_eventbuffer_max_alloc 系统变量的值相同。

签名
unsigned get_eventbuf_max_alloc
    (
      void
    )
参数

.

返回值

事件缓冲区可用的最大内存,以字节为单位。

Ndb::get_eventbuffer_free_percent()

描述

获取 ndb_eventbuffer_free_percent,即在 ndb_eventbuffer_max_alloc 已达上限后,在恢复缓冲之前,应保留的事件缓冲区内存的百分比。此值计算为 used * 100 / ndb_eventbuffer_max_alloc,其中 used 是实际使用的事件缓冲区内存量,以字节为单位。

此方法是在 NDB 7.4 中添加的。

签名
unsigned get_eventbuffer_free_percent
    (
      void
    )
参数

必须存在的事件缓冲区内存的百分比 (pct)。有效范围为 1 到 99(含)。

返回值

.

Ndb::get_event_buffer_memory_usage()

描述

获取事件缓冲区使用率,以 ndb_eventbuffer_max_alloc 的百分比表示。与 get_eventbuffer_free_percent() 不同,此方法以 EventBufferMemoryUsage 数据结构的形式提供完整的使用信息。

此方法是在 NDB 7.4 中添加的。

签名
void get_event_buffer_memory_usage
    (
      EventBufferMemoryUsage&
    )
参数

指向一个 EventBufferMemoryUsage 结构的引用,该结构接收使用数据。

返回值

.

Ndb::getHighestQueuedEpoch()

描述

在 NDB 7.4 中添加,此方法取代了 getLatestGCI(),该方法现在已弃用,并且可能会在未来的 NDB 集群版本中删除。

在 NDB 7.4.7 之前,此方法返回事件队列中最大的纪元编号。在 NDB 7.4.7 及更高版本中,它返回在调用 pollEvents2() 后找到的最大的纪元编号。(错误 #20700220)

签名
Uint64 getHighestQueuedEpoch
    (
      void
    )
参数

.

返回值

最近的纪元编号,一个整数。

Ndb::getLatestGCI() (已弃用)

描述

获取最新的全局检查点的索引。

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中,您应使用 getHighestQueuedEpoch() 代替。

签名
Uint64 getLatestGCI
    (
      void
    )
参数

.

返回值

最新的 GCI,一个整数。

Ndb::getNdbError()

描述

此方法提供两种不同的方法来获取一个 NdbError 对象,该对象表示错误条件。有关 NDB API 中错误处理的更详细的信息,请参见 NDB 集群 API 错误

签名

getNdbError() 方法实际上有两个变体。

第一个变体只获取最近发生的错误

const NdbError& getNdbError
    (
      void
    )

第二个变体返回与给定错误代码对应的错误

const NdbError& getNdbError
    (
      int errorCode
    )

无论使用哪种版本的该方法,返回的 NdbError 对象一直持续到下一个 NDB API 方法被调用。

参数

要获取最近发生的错误,只需调用不带任何参数的 getNdbError() 即可。要获取与特定 errorCode 匹配的错误,请调用该方法并将其传递给它作为参数 (一个 int)。有关 NDB API 错误代码和相应错误消息的列表,请参见 第 2.4 节,“NDB API 错误和错误处理”

返回值

一个 NdbError 对象,其中包含有关错误的信息,包括其类型以及在适用的情况下,有关错误如何发生的上下文信息。有关详细信息,请参见 第 2.3.15 节,“NdbError 结构”

Ndb::getNdbErrorDetail()

描述

此方法提供了一种简单而安全的方法来访问有关错误的任何额外信息。与从 NdbError 对象的 details 属性 (现在已弃用,转而使用 getNdbErrorDetail(),参见 Bug #48851) 读取这些额外详细信息不同,此方法允许将这些详细信息存储在用户提供的缓冲区中,并返回指向该缓冲区开头的指针。如果包含详细信息的字符串超过缓冲区长度,则会将其截断以适应缓冲区。

getErrorDetail() 以字符串的形式提供错误的来源。在唯一约束违反的情况下 (错误 893),此字符串提供问题起源的索引的完全限定名称,格式为 database-name/schema-name/table-name/index-name,(NdbError.details 另一方面,只提供索引 ID,而且通常不清楚该索引属于哪个表。) 无论错误的类型和有关此错误的详细信息如何,由 getErrorDetail() 检索的字符串始终以 null 结尾。

签名

getNdbErrorDetail() 方法具有以下签名

const char* getNdbErrorDetail
            (
              const NdbError& error,
              char*           buffer,
              Uint32          bufferLength
            ) const
参数

要获取有关错误的详细信息,请使用对相应 NdbError 对象、buffer 和该缓冲区的长度 (以无符号 32 位整数表示) 的引用调用 getNdbErrorDetail()

返回值

error 的额外详细信息可用时,此方法将返回指向提供的 buffer 开头的指针。如前所述,如果包含详细信息的字符串长于 bufferLength,则字符串将被截断以适应缓冲区。如果没有任何额外详细信息可用,getNdbErrorDetail() 将返回 NULL

Ndb::getNdbObjectName()

描述

如果在 Ndb 对象初始化之前为其设置了名称,则可以使用此方法检索该名称。用于调试。

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

.

返回值

Ndb 对象的名称 (如果已使用 setNdbObjectName() 设置)。否则,此方法将返回 0。

Ndb::getNextEventOpInEpoch2()

描述

迭代构成当前全局检查点的单个事件操作。使用以下 nextEvent2() 获取时期的摘要信息,例如所有表的列表,然后再处理事件数据。

异常时期没有与之关联的任何事件操作。

签名
const NdbEventOperation* getNextEventOpInEpoch2
    (
      Uint32* iter,
      Uint32* event_types
    )
参数

最初将 iter 设置为 0;当此时期内没有更多事件时,此值将为 NULL。如果 event_types 不为 NULL,它将保存接收到的事件类型的位掩码。

返回值

指向下一个 NdbEventOperation 的指针 (如果有)。

Ndb::getNextEventOpInEpoch3()

描述

迭代构成当前全局检查点的单个事件操作。使用以下 nextEvent2() 获取时期的摘要信息,例如所有表的列表,然后再处理事件数据。与 getNextEventOpInEpoch3() 相同,但新增了第三个参数,该参数保存接收到的所有 AnyValues 的合并结果,显示为给定表上的所有操作设置了哪些位。

异常时期没有与之关联的任何事件操作。

此方法是在 NDB 7.4.18 和 7.5.9 中添加的。(Bug #26333981)

签名
const NdbEventOperation* getNextEventOpInEpoch2
    (
      Uint32* iter,
      Uint32* event_types
      Uint32* cumulative_any_value
    )
参数

最初将 iter 设置为 0;当此时期内没有更多事件时,此值将为 NULL。如果 event_types 不为 NULL,它将保存接收到的事件类型的位掩码。如果 cumulative_any_value 不为 NULL,它将保存接收到的所有 AnyValues 的合并结果。

返回值

指向下一个 NdbEventOperation 的指针 (如果有)。

Ndb::getReference()

描述

此方法可用于获取对给定 Ndb 对象的引用。此值与 DUMP 2350 输出中与该对象对应的给定操作返回的值相同。

签名
Uint32 getReference
    (
      void
    )
参数

.

返回值

一个 32 位无符号整数。

Ndb::init()

描述

此方法用于初始化 Ndb 对象。

签名
int init
    (
      int maxNoOfTransactions = 4
    )
参数

init() 方法接受一个类型为整数的单个参数 maxNoOfTransactions。此参数指定此 Ndb 实例可以处理的并行 NdbTransaction 对象的最大数量。maxNoOfTransactions 的最大允许值为 1024;如果未指定,则默认为 4。

每个扫描或索引操作都会使用额外的 NdbTransaction 对象。

返回值

此方法返回一个 int,它可以是以下两个值之一

  • 0: 表示 Ndb 对象已成功初始化。

  • -1: 表示失败。

Ndb::isConsistent() (已弃用)

描述

检查所有事件是否一致。如果在资源耗尽时发生节点故障,事件可能会丢失,因此传递的事件数据可能不完整。此方法可以确定是否发生了这种情况。

此方法在 NDB 7.4 中已弃用,并且将在未来的版本中被删除。在 NDB 7.4 及更高版本中,您应该使用 NdbEventOperation::getEventType2() 来确定事件的类型,在本例中,确定事件是否为类型 TE_INCONSISTENT。请参见 Event::TableEvent

签名
bool isConsistent
    (
      Uint64& gci
    )
参数

对全局检查点索引的引用。如果存在任何不一致,这是找到的第一个不一致 GCI。

返回值

如果所有事件都一致,则为 true

Ndb::isConsistentGCI() (已弃用)

描述

如果在资源耗尽时发生节点故障,事件可能会丢失,因此传递的事件数据可能不完整。此方法可以通过检查给定 GCI 中的所有事件是否一致来确定是否发生了这种情况。

此方法在 NDB 7.4 中已弃用,并且将在未来的版本中被删除。在 NDB 7.4 及更高版本中,您应该使用 NdbEventOperation::getEventType2() 来确定事件的类型,在本例中,确定事件是否为类型 TE_INCONSISTENT。请参见 Event::TableEvent

签名
bool isConsistentGCI
    (
      Uint64 gci
    )
参数

一个全局检查点索引。

返回值

如果此 GCI 一致,则为 truefalse 表示 GCI 可能不一致。

Ndb::isExpectingHigherQueuedEpochs()

描述

检查最后一次调用 Ndb::pollEvents2() 时是否已看到更高的排队时期,或者是否找到了 TE_CLUSTER_FAILURE 事件。

在检测到集群故障后,有可能 pollEvents2() 返回的最高排队时期不再增加。在这种情况下,您应该使用 nextEvent() 使用事件,而不是轮询更多事件,直到检测到 TE_CLUSTER_FAILURE,然后在集群再次可用时重新连接到集群。

签名
bool isExpectingHigherQueuedEpochs
      (
        void
      )
参数

.

返回值

如果最后一次调用 pollEvents2() 时已看到排队时期,或在集群发生故障时,则为 true。

Ndb::Key_part_ptr

本节介绍 Key_part_ptr 结构。

父类

Ndb

描述

Key_part_ptr 提供了一种方便的方式来定义开始事务和计算哈希值时的键部分数据,方法是传入指向分布键值的指针。当分布键包含多个部分时,应将其作为数组传入,最后一个部分的指针应设置为 NULL。有关此结构如何使用的更多信息,请参见 Ndb::startTransaction()Ndb::computeHash()

属性

Key_part_ptr 具有下表中显示的属性

表 2.28 Key_part_ptr 结构属性,包括类型、初始值和描述

属性 类型 初始值 描述
ptr const void* 指向一个或多个分布键值的指针
len 无符号 指针的长度

Ndb::nextEvent() (已弃用)

描述

返回订阅队列中包含数据的下一个事件操作。

此方法在处理事件时会从事件队列中清除不一致的数据事件。为了能够清除所有此类事件,即使在 pollEvents() 已返回 0 的情况下,应用程序也必须调用此方法。

此方法在 NDB 7.4 中已弃用,并且将在未来的版本中被删除。在 NDB 7.4 及更高版本中,您应该使用 nextEvent2() 代替。

签名
NdbEventOperation* nextEvent
    (
      void
    )
参数

无。

返回值

此方法返回一个 NdbEventOperation 对象,该对象表示订阅队列中的下一个事件 (如果有)。如果队列中没有事件,它将返回 NULL

Ndb::nextEvent2()

描述

返回与从事件队列中出队的关联的事件操作。在 pollEvents2() 填充队列后,应重复调用此方法,直到事件队列为空。

此方法是在 NDB 7.4 中添加的,它取代了 nextEvent(),后者现在已弃用,并将被删除,以便在将来的 NDB 集群版本中使用。

调用此方法后,使用 NdbEventOperation::getEpoch() 确定纪元,然后使用 NdbEventOperation::getEventType2() 检查返回事件数据的类型。必须针对所有异常 TableEvent 类型提供处理,包括 TE_EMPTYTE_INCONSISTENTTE_OUT_OF_MEMORY(也引入 NDB 7.4)。对于异常纪元,不应调用此处命名的两个方法以外的任何其他 NdbEventOperation 方法。返回空纪元 (TE_EMPTY) 可能会在数据节点处于空闲状态时淹没应用程序。如果这是不可取的,应用程序应该过滤掉任何空纪元。

签名
NdbEventOperation* nextEvent2
    (
      void
    )
参数

无。

返回值

此方法返回一个 NdbEventOperation 对象,表示事件队列中的下一个事件(如果有这样的事件)。如果队列中没有事件,它将返回 NULL

Ndb::PartitionSpec

本节提供有关 PartitionSpec 结构的信息。

父类

Ndb

描述

使用 PartitionSpec 来描述表分区,使用以下任意一个标准

  • 对于具有用户定义分区的表,指定的分区 ID。

  • 对于具有本机分区的表,由表的分布键值组成的数组。

  • 包含本机分区表的分布键值的 NdbRecord 格式的行。

属性

一个 PartitionSpec 具有两个属性,一个 SpecType 和一个 Spec,它是一个对应于该 SpecType 的数据结构,如以下表格所示

表 2.29 PartitionSpec 属性,包含每个属性的 SpecType 值、数据结构和描述。

SpecType 枚举 SpecType 值 (Uint32) 数据结构 描述
PS_NONE 0 不提供任何分区信息。
PS_USER_DEFINED 1 Ndb::PartitionSpec::UserDefined 对于具有用户定义分区的表,使用其分区 ID 来标识特定分区。
PS_DISTR_KEY_PART_PTR 2 Ndb::PartitionSpec::KeyPartPtr 对于具有本机分区的表,使用包含表的分布键值的数组来标识分区。
PS_DISTR_KEY_RECORD 3 Ndb::PartitionSpec::KeyRecord 使用包含在本机分区表的分布键值的 NdbRecord 格式的行来标识分区。

UserDefined 结构. SpecTypePS_USER_DEFINED 时,将使用此结构。

表 2.30 PS_USER_DEFINED SpecType 的 partitionId 属性的属性类型

属性 类型 描述
partitionId Uint32 所需表的 partition ID。

KeyPartPtr 结构. SpecTypePS_DISTR_KEY_PART_PTR 时,将使用此结构。

表 2.31 PS_DISTR_KEY_PART_PTR SpecType 的属性,以及属性类型和描述

属性 类型 描述
tableKeyParts Key_part_ptr 指向具有本机分区的表的分布键值的指针。
xfrmbuf void* 指向用于执行计算的临时缓冲区的指针。
xfrmbuflen Uint32 临时缓冲区的长度。

KeyRecord 结构. SpecTypePS_DISTR_KEY_RECORD 时,将使用此结构。

表 2.32 PS_DISTR_KEY_RECORD SpecType 属性,以及属性类型和描述

属性 类型 描述
keyRecord NdbRecord NdbRecord 格式表示的行,包含表的分布键。
keyRow const char* 分布键数据。
xfrmbuf void* 指向用于执行计算的临时缓冲区的指针。
xfrmbuflen Uint32 临时缓冲区的长度。

来自 Ndb.hpp 的定义.  由于这是一个相当复杂的结构,因此在此提供 PartitionSpec 的原始源代码定义,如 storage/ndb/include/ndbapi/Ndb.hpp 中所示

struct PartitionSpec
{
  /*
    Size of the PartitionSpec structure.
  */
  static inline Uint32 size()
  {
      return sizeof(PartitionSpec);
  }

  enum SpecType
  {
    PS_NONE                = 0,
    PS_USER_DEFINED        = 1,
    PS_DISTR_KEY_PART_PTR  = 2,
    PS_DISTR_KEY_RECORD    = 3
  };

  Uint32 type;
  
  union
  {
    struct {
      Uint32 partitionId;
    } UserDefined;
    
    struct {
      const Key_part_ptr* tableKeyParts;
      void* xfrmbuf;
      Uint32 xfrmbuflen;
    } KeyPartPtr;

    struct {
      const NdbRecord* keyRecord;
      const char* keyRow;
      void* xfrmbuf;
      Uint32 xfrmbuflen;
    } KeyRecord;
  };
};

Ndb::pollEvents()

描述

此方法等待 GCP 完成。它用于确定订阅队列中是否有任何事件可用。

此方法等待下一个 纪元,而不是下一个 GCP。有关更多信息,请参见 第 2.3.16 节,“NdbEventOperation 类”

此方法已弃用,将在将来的 NDB Cluster 版本中删除;请改用 pollEvents2()

签名
int pollEvents
    (
      int     maxTimeToWait,
      Uint64* latestGCI = 0
    )
参数

此方法接受此处列出的两个参数

  • 放弃 并报告没有事件可用之前(即,在方法自动返回 0 之前)的最大等待时间(以毫秒为单位)。

    负值会导致等待时间无限长,永不超时。不建议这样做(也不受后续方法 pollEvents2() 支持)。

  • 最新全局检查点的索引。通常,可以安全地将其设置为默认值,即 0

返回值

pollEvents() 返回一个类型为 int 的值,可以将其解释如下

  • > 0: 队列中有事件可用。

  • 0: 没有事件可用。

  • 在 NDB 7.6.28、8.0.35、8.2.0 及更高版本中,负值表示失败,NDB_FAILURE_GCI (~(Uint64)0) 表示集群失败(错误 #35671818);当遇到异常事件时,将返回 1,但当仅找到 TE_EMPTY 事件时除外,如本节后面所述。

pollEvents() 在事件队列的开头找到异常事件时,该方法将返回 1,否则将按如下方式运行

  • 空事件 (TE_EMPTY) 将从事件队列头部删除,直到找到包含数据的事件。当这导致整个队列被处理,而没有遇到任何数据时,该方法将返回 0(没有事件可用),而不是 1。此行为使此事件类型对使用 pollEvents() 的应用程序透明。

  • 在由于数据节点缓冲区溢出而遇到包含不一致数据的事件 (TE_INCONSISTENT) 后,对 nextEvent() 的下一次调用将从事件队列中删除不一致的数据事件数据,并返回 NULL。您应该立即通过调用 isConsistent() 检查不一致。

    重要: 尽管不一致的事件数据已通过调用 nextEvent() 从事件队列中删除,但有关不一致的信息只有在随后另一个实际找到包含数据的事件的 nextEvent() 调用之后才会被删除。

  • pollEvents() 找到数据缓冲区溢出事件 (TE_OUT_OF_MEMORY) 时,只要事件缓冲区使用量超过 ndb_eventbuffer_max_alloc,事件数据就会被添加到事件队列中。在这种情况下,对 nextEvent() 的下一次调用将退出进程。

Ndb::pollEvents2()

描述

等待事件发生。一旦有任何事件数据可用,就会返回。此方法还将纪元的完整事件数据移动到事件队列。

此方法取代了 pollEvents(),后者现已弃用,将在将来的 NDB Cluster 版本中删除。

签名
int pollEvents2
    (
      int aMillisecondNumber,
      Uint64* highestQueuedEpoch = 0
    )
参数

此方法接受此处列出的两个参数

  • 在放弃并报告没有事件可用之前(即,在方法自动返回 0 之前)的最大等待时间(以毫秒为单位)。

    为该参数指定负值会导致 pollEvents2() 返回 -1,表示错误。

  • 最高排队纪元的索引。通常,可以安全地将其设置为默认值,即 0。如果此值不为 NULL,并且事件队列中有新的事件数据可用,则它将设置为在可用事件数据中找到的最高纪元。

返回值

pollEvents2() 返回一个整数,其值可以解释如下

  • > 0: 队列中有事件可用。

  • 0: 没有事件可用。

  • < 0: 表示失败(可能存在错误)。

Ndb::setDatabaseName()

描述

此方法用于设置当前数据库的名称。

签名
void setDatabaseName
    (
      const char *databaseName
    )
参数

setDatabaseName() 接受一个必需的参数,即要设置为当前数据库的新数据库的名称。

返回值

.

Ndb::setDatabaseSchemaName()

描述

此方法设置当前数据库模式的名称。

签名
void setDatabaseSchemaName
    (
      const char *databaseSchemaName
    )
参数

数据库模式的名称。

返回值

.

Ndb::setEventBufferQueueEmptyEpoch()

描述

默认情况下,禁用空纪元的排队。可以使用此方法来启用这种排队,在这种情况下,在方法调用之后进入事件缓冲区的任何新的空纪元都将被排队。

当启用空纪元的排队时,nextEvent() 将空纪元关联到一个订阅(事件操作)到订阅 Ndb 对象的事件操作。这意味着每个订阅最多只能有一个空纪元,即使用户可能与同一个 Ndb 对象关联了多个订阅。

setEventBufferQueueEmptyEpoch() 没有关联的 getter 方法。这是故意的,这是因为此 setter 适用于排队 新的 纪元,而队列本身可能仍然反映在调用 setter 之前存在的现状。因此,在过渡期间,即使关闭了排队,也可能会在队列中找到空纪元。

setEventBufferQueueEmptyEpoch() 是在 NDB 7.4.11 中添加的。

签名
void setEventBufferQueueEmptyEpoch
  (
    bool queue_empty_epoch
  )
参数

此方法接受一个输入参数,即布尔值。用 true 调用该方法将启用空事件的排队;将 false 传递给该方法将禁用这种排队。

返回值

.

Ndb::set_eventbuf_max_alloc()

描述

设置可用于事件缓冲区的最大内存量(以字节为单位)。这与在 MySQL 服务器中设置 ndb_eventbuffer_max_alloc 系统变量的值的效果相同。

签名
void set_eventbuf_max_alloc
    (
      unsigned size
    )
参数

事件缓冲区的所需最大 size(以字节为单位)。

返回值

.

Ndb::set_eventbuffer_free_percent()

描述

设置 ndb_eventbuffer_free_percent,即一旦达到 ndb_eventbuffer_max_alloc,缓冲区恢复之前应可用的事件缓冲区内存的百分比。

此方法是在 NDB 7.4 中添加的。

签名
int set_eventbuffer_free_percent
    (
      unsigned pct
    )
参数

必须存在的事件缓冲区内存的百分比 (pct)。有效范围为 1 到 99(含)。

返回值

设置的值。

Ndb::setNdbObjectName()

描述

您还可以设置一个任意的、人类可读的名称来标识 Ndb 对象,以用于调试目的。然后可以使用 getNdbObjectName() 检索此名称。必须在调用 init() 来初始化此对象之前完成此操作;尝试在初始化后设置名称会导致错误。

对于给定的 Ndb 对象,您只能设置一次名称;在名称已设置后进行的后续尝试会导致错误。

签名
int setNdbObjectName
    (
      const char* name
    )
参数

一个旨在供人类阅读的 name

返回值

成功时返回 0。

Ndb::startTransaction()

描述

此方法用于启动新的事务。有三种变体,其中最简单的一种使用一个表和一个分区键或分区 ID 来指定事务协调器 (TC)。第三种变体允许您通过指向键数据的指针来指定 TC。

事务完成后,必须使用 NdbTransaction::close()Ndb::closeTransaction() 关闭它。否则,事务将中止。无论事务的最终结果如何,都必须执行此操作,即使它因错误而失败也是如此。

有关更多信息,请参阅 Ndb::closeTransaction()NdbTransaction::close()

签名
NdbTransaction* startTransaction
    (
      const NdbDictionary::Table* table = 0,
      const char* keyData = 0,
      Uint32* keyLen = 0
    )
参数

此方法接受以下三个参数

  • table:指向一个 Table 对象的指针。这用于确定事务协调器应在哪个节点上运行。

  • keyData:指向对应于 table 的分区键的指针。

  • keyLen:分区键的长度,以字节为单位。

分布式感知的 startTransaction() 形式。  此方法也可以使用 分布式感知;即,建议哪个节点应作为事务协调器。

签名
NdbTransaction* startTransaction
    (
      const NdbDictionary::Table* table,
      const struct Key_part_ptr*  keyData,
      void*                       xfrmbuf = 0,
      Uint32                      xfrmbuflen = 0
    )
参数

在指定事务协调器时,此方法接受此处列出的四个参数

  • 指向一个 table (Table 对象) 的指针,用于决定哪个节点应充当事务协调器。

  • 指向分布键列值的指针的空终止数组。键部分的长度从元数据中读取,并与传递的值进行检查。

    Ndb::Key_part_ptr 的定义如 Ndb::Key_part_ptr 所示。

  • 指向临时缓冲区的指针,用于计算哈希值。

    如果 xfrmbufNULL(默认值),则会根据需要自动调用 malloc()free()

    在 NDB 7.5.30、7.6.26 和 8.0.33 之前:如果 xfrmbuf 不为 NULLxfrmbuflen 太小,则 startTransaction() 失败。

    NDB 7.5.30 及更高版本、7.6.26 及更高版本、8.0.33 及更高版本:如果传递的缓冲区大小不足,则会自动分配临时缓冲区。(错误 #103814、错误 #32959894、错误 #34917498)

  • 缓冲区的长度。

返回值

成功时,返回一个 NdbTransaction 对象。如果失败,则返回 NULL

示例

假设表的 partition key 是一个单独的 BIGINT 列。然后,您将按如下所示声明分布键数组

Key_part_ptr distkey[2];

分布键的值将按如下所示定义

unsigned long long distkeyValue= 23;

指向分布键数组的指针将按如下所示设置

distkey[0].ptr= (const void*) &distkeyValue;

此指针的长度将相应地设置

distkey[0].len= sizeof(distkeyValue);

分布键数组必须以 NULL 元素结尾。这是为了避免使用额外的参数来提供分布键中的列数

distkey[1].ptr= NULL;
distkey[1].len= NULL;

将缓冲区设置为 NULL 允许 startTransaction() 自动分配和释放内存

xfrmbuf= NULL;
xfrmbuflen= 0;

现在,当您启动事务时,可以直接访问包含所需信息的节点。

此方法的另一个分布式感知版本允许您指定一个表和一个分区(使用分区 ID)作为选择事务协调器的提示,定义如下

NdbTransaction* startTransaction
    (
      const NdbDictionary::Table* table,
      Uint32 partitionId
    )

如果集群的数据节点数量与其碎片副本数量相同,则指定事务协调器不会提高性能,因为每个数据节点都包含整个数据库。但是,如果数据节点的数量大于碎片副本的数量(例如,如果 NoOfReplicas 在具有四个数据节点的集群中设置为 2),则使用此方法的分布式感知版本会显着提高性能。

仍然可以使用以前的方式使用此方法,而无需指定事务协调器。无论哪种情况,您都必须显式关闭事务,无论对 startTransaction() 的调用是否成功。