2.3.11 Ndb 类

本节提供有关Ndb 模拟NDB内核的类的信息;它是 NDB API 的主要类。

Ndb 类概述

家长班

没有任何

儿童班

没有任何

描述

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

方法

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

表 2.25 Ndb 类方法及说明

姓名 描述
Ndb() 类构造函数;表示与 NDB Cluster 的连接。
~Ndb() 类析构函数;不再使用时终止集群连接
closeTransaction() 关闭事务。
computeHash() 计算分布散列值。
createEventOperation() 创建对数据库事件的订阅。(请参阅 第 2.3.16 节,“NdbEventOperation 类”。)
dropEventOperation() 删除对数据库事件的订阅。
getDictionary() 获取一个字典,用于处理数据库架构信息。
getDatabaseName() 获取当前数据库的名称。
getDatabaseSchemaName() 获取当前数据库架构的名称。
get_eventbuf_max_alloc() 获取当前分配的事件缓冲区的最大大小。在 NDB 7.3.3 中添加。
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对象名称(如果已设置)。在 NDB 7.3.6 中添加。
getNextEventOpInEpoch2() 获取此全局检查点中的下一个事件操作。
getNextEventOpInEpoch3() 获取此全局检查点中的下一个事件操作,显示任何接收到的任何值。在 NDB 7.3.20、7.4.18 和 7.5.9 中添加。
getReference() 检索Ndb 对象实例的引用或标识符。
init() 初始化Ndb对象并使其准备好使用。
isConsistent() 所有收到的事件是否一致。在 NDB 7.4 中已弃用。
isConsistentGCI() 给定全局检查点的所有接收事件是否一致。在 NDB 7.4 中已弃用。
isExpectingHigherQueuedEpochs() 检查是否有新的排队纪元,或者是否有集群故障事件。在 NDB 7.3.10 和 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() 设置当前分配的事件缓冲区的最大大小。在 NDB 7.3.3 中添加。
set_eventbuffer_free_percent() 一旦达到限制,设置在缓冲恢复之前应该可用的事件缓冲区内存的百分比。在 NDB 7.4 中添加。
setNdbObjectName() Ndb出于调试目的:为此对象设置任意名称 。在 NDB 7.3.6 中添加。
startTransaction() 开始交易。(请参阅第 2.3.25 节,“NdbTransaction 类”。)

类型

该类Ndb没有定义任何公共类型,但确实定义了三个数据结构,如下所列:

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

笔记

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

信号量和互斥量是提供内存屏障的简单方法的示例,而无需担心内存屏障概念。

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

Ndb 类构造函数

描述

这将创建一个实例 Ndb,它表示与 NDB Cluster 的连接。所有 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 类”。)

    在 NDB 7.3.8 之前,可以删除 Ndb_cluster_connection用于创建给定实例的,Ndb而无需先删除依赖Ndb对象。(漏洞#19999242)

  • 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则设置为计算的哈希值。

  • 指向 a 的指针table(参见 第 2.3.27 节,“表类”)。

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

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

  • xfrmbuflen是这个缓冲区的长度。

    笔记

    如果xfrmbufNULL(默认值),则根据需要自动调用 malloc()or free()computeHash()如果 xfrmbuf不是 NULL并且 xfrmbuflen太小则失败。

    以前,假设malloc()调用返回的内存总是适当对齐的,但情况并非总是如此。当 malloc()向此方法提供缓冲区时,缓冲区在分配后、实际使用前会显式对齐。(漏洞 #16484617)

返回值

成功时为 0,失败时为错误代码。如果方法调用成功,计算的哈希值将通过 提供 hashvalueptr

Ndb::createEventOperation()

描述

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

使用ndb_restore 恢复 NDB Cluster 后,NDB API 事件订阅不会持续存在 ;在这种情况下,必须明确地重新创建所有订阅。

签名
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.26 EventBufferMemoryUsage 结构属性,包括类型、初始值和描述

姓名 类型 初始值 描述
allocated_bytes unsigned 没有任何 分配的总事件缓冲区内存,以字节为单位
used_bytes unsigned 没有任何 使用的总内存,以字节为单位
usage_percent unsigned 没有任何 事件缓冲区内存使用情况,百分比 ( 100 * used_bytes / allocated_bytes)

Ndb::getDictionary()

描述

此方法用于获取用于检索或操作数据库架构信息的对象。该 Dictionary对象包含有关集群中所有表的元信息。

此方法返回的字典独立于任何事务运行。有关更多信息,请参见 第 2.3.3 节,“字典类”

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

没有

返回值

类的一个实例 Dictionary

Ndb::getDatabaseName() 方法

描述

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

签名
const char* getDatabaseName
    (
      void
    )
参数

没有任何。

返回值

当前数据库的名称。

Ndb::getDatabaseSchemaName() 方法

描述

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

签名
const char* getDatabaseSchemaName
    (
      void
    )
参数

没有

返回值

当前数据库模式的名称。

Ndb::getGCIEventOperations()(弃用)

描述

迭代属于当前 GCI 的不同事件操作,在调用 nextEvent(). 在处理事件数据之前,您可以使用此方法获取纪元的摘要信息(例如所有表的列表)。

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

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

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

返回值

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

Ndb::get_eventbuf_max_alloc()

描述

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

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

签名
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 Cluster 版本中删除的方法。

在 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 Cluster API 错误

签名

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

其中第一个只是获取最近发生的错误:

const NdbError& getNdbError
    (
      void
    )

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

const NdbError& getNdbError
    (
      int errorCode
    )

无论使用哪个版本的方法, NdbError返回的对象都会一直存在,直到调用下一个 NDB API 方法。

参数

要获取最近的错误,只需调用 getNdbError()而不带任何参数。要获取与特定 匹配的错误 errorCode,请调用将代码 (an 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
参数

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

返回值

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

Ndb::getNdbObjectName()

描述

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

此方法是在 NDB 7.3.6 中添加的。(漏洞 #18419907)

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

没有

返回值

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

Ndb::getNextEventOpInEpoch2()

描述

迭代构成当前全局检查点的单个事件操作。在处理事件数据之前,使用 following nextEvent2()获取 epoch 的摘要信息,例如所有表的列表。

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

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

初始设置iter为0;这是 NULL这个时期内没有更多事件的时候。如果 event_types不是 NULL,它保存接收到的事件类型的位掩码。

返回值

指向 next 的指针 NdbEventOperation(如果有的话)。

Ndb::getNextEventOpInEpoch3()

描述

迭代构成当前全局检查点的单个事件操作。在处理事件数据之前,使用 following nextEvent2()获取 epoch 的摘要信息,例如所有表的列表。与此相同, getNextEventOpInEpoch3() 但添加了第三个参数,该参数保存所有接收到的 AnyValues 的合并,显示为给定表上的所有操作设置了哪些位。

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

在 NDB 7.3.20、7.4.18 和 7.5.9 中添加了此方法。(漏洞 #26333981)

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

初始设置iter为0;这是 NULL这个时期内没有更多事件的时候。如果 event_types不是 NULL,它保存接收到的事件类型的位掩码。如果 cumulative_any_value不是 NULL,则它保存所有收到的 AnyValues 的合并。

返回值

指向 next 的指针 NdbEventOperation(如果有的话)。

Ndb::getReference() 方法

描述

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

签名
Uint32 getReference
    (
      void
    )
参数

没有

返回值

一个 32 位无符号整数。

导航台::初始化()

描述

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

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

init()方法采用整数类型的单个参数maxNoOfTransactionsNdbTransaction 此参数指定此实例可以处理 的最大并行对象数Ndb。的最大允许值为maxNoOfTransactions1024;如果未指定,则默认为 4。

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

返回值

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

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

  • -1:表示失败。

Ndb::isConsistent() (弃用)

描述

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

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中,您应该改为使用 NdbEventOperation::getEventType2() 来确定事件的类型 - 在这种情况下,事件是否为 类型 TE_INCONSISTENT。请参阅 事件::表事件

签名
bool isConsistent
    (
      Uint64& gci
    )
参数

对全局检查点索引的引用。如果有的话,这是发现的第一个不一致的 GCI。

返回值

true如果所有事件都一致。

Ndb::isConsistentGCI()(弃用)

描述

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

此方法在 NDB 7.4 中已弃用,并且可能会在未来的版本中删除。在 NDB 7.4 及更高版本中,您应该改为使用 NdbEventOperation::getEventType2() 来确定事件的类型 - 在这种情况下,事件是否为 类型 TE_INCONSISTENT。请参阅 事件::表事件

签名
bool isConsistentGCI
    (
      Uint64 gci
    )
参数

全局检查点索引。

返回值

true如果这个 GCI 是一致的; false表示 GCI 可能不一致。

Ndb::isExpectingHigherQueuedEpochs()

描述

检查上次调用是否已看到更高队列的纪元 Ndb::pollEvents2(),或者是否找到了TE_CLUSTER_FAILURE事件。

在检测到集群故障后,返回的最高排队纪元 pollEvents2()可能不再增加。在这种情况下,与其轮询更多事件,不如使用事件 nextEvent()直到检测到TE_CLUSTER_FAILURE被检测到,然后在集群再次可用时重新连接到集群。

NDB 7.3.10 和 7.4.7 中添加了此方法(缺陷 #18753887)。

签名
bool isExpectingHigherQueuedEpochs
      (
        void
      )
参数

没有

返回值

如果最后一次调用看到排队的纪元, pollEvents2()或者在集群失败的情况下,则为真。

Ndb::Key_part_ptr

本节介绍Key_part_ptr 结构。

家长班

Ndb

描述

Key_part_ptr通过传递指向分布键值的指针,提供了一种在开始交易和计算哈希值时定义键部分数据的便捷方法。当分配键有多个部分时,它们应该作为数组传递,最后一部分的指针设置为 NULL。有关如何使用此结构的更多信息, 请参阅 Ndb::startTransaction()Ndb::computeHash() 。

属性

AKey_part_ptr具有下表所示的属性:

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

属性 类型 初始值 描述
ptr const void* 没有任何 指向一个或多个分布键值的指针
len unsigned 没有任何 指针的长度

Ndb::nextEvent() (弃用)

描述

返回具有来自订阅队列的数据的下一个事件操作。

从 NDB 7.3.6 开始,此方法在处理它们时从事件队列中清除不一致的数据事件。为了能够清除这些和更高版本中的所有此类事件,应用程序必须调用此方法,即使在pollEvents()已经返回 0 的情况下也是如此。(错误 #18716991)

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

签名
NdbEventOperation* nextEvent
    (
      void
    )
参数

没有任何。

返回值

NdbEventOperation如果存在这样的事件, 此方法将返回表示订阅队列中下一个事件的 对象。如果队列中没有事件,则返回NULL

Ndb::nextEvent2()

描述

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

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

调用此方法后,使用 NdbEventOperation::getEpoch() 判断纪元,然后使用检查返回事件数据的类型 NdbEventOperation::getEventType2()。必须为所有异常 TableEvent类型提供处理,包括TE_EMPTYTE_INCONSISTENTTE_OUT_OF_MEMORY(也在 NDB 7.4 中引入)。除了这里提到的两个方法之外,没有其他 NdbEventOperation方法应该被称为一个特殊的时代。TE_EMPTY当数据节点空闲时,返回空 epochs ( ) 可能会淹没应用程序。如果这是不可取的,应用程序应该过滤掉任何空的时期。

签名
NdbEventOperation* nextEvent2
    (
      void
    )
参数

没有任何。

返回值

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

Ndb::PartitionSpec

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

家长班

Ndb

描述

APartitionSpec用于使用以下任一条件描述表分区:

  • 具有用户定义分区的表的特定分区 ID。

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

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

属性

APartitionSpec有两个属性,a SpecType和aSpec 是that对应的数据结构 SpecType,如下表所示:

表 2.28 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格式中给定的行中。

用户定义的结构。 SpecType当is 时使用此结构PS_USER_DEFINED

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

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

KeyPartPtr 结构。 SpecType当is 时使用此结构PS_DISTR_KEY_PART_PTR

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

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

密钥记录结构。 SpecType当is 时使用此结构PS_DISTR_KEY_RECORD

表 2.31 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 7.4 中,此方法已弃用,并会在未来的 NDB Cluster 版本中删除;改用 pollEvents2()

在 NDB 7.4.7 之前,与之前在 NDB 7.4 中添加pollEvents()的异常类型不兼容 TableEvent(错误#20646496);在 NDB 7.4.7 及更高版本中,pollEvents()与这些事件类型兼容,如本节后面所述。

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

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

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

    负值会导致等待无限期且永远不会超时。不推荐这样做(并且不被后继方法支持 pollEvents2())。

  • 最近的全局检查点的索引。通常,可以安全地允许它采用其默认值,即0.

返回值

pollEvents()返回 type 的值 int,可以解释如下:

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

  • 0: 没有可用的事件。

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

在 NDB 7.4.7 及更高版本中,当pollEvents() 在事件队列的头部发现异常事件时,该方法返回 1,否则行为如下:

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

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

    重要提示:虽然不一致的事件数据通过调用从事件队列中删除,但nextEvent()有关不一致的信息只能通过此后的另一个 nextEvent()调用删除,该调用实际上找到了包含数据的事件。

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

Ndb::pollEvents2()

描述

等待事件发生。任何事件数据可用时立即返回。此方法还将一个纪元的完整事件数据移动到事件队列中。

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

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

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

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

    在 NDB 7.4.7 及更高版本中,为此参数指定负值会导致pollEvents2()返回 -1,指示错误(错误 #20762291)。

  • 最高排队时期的索引。通常,可以安全地允许它采用其默认值,即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
  )
参数

此方法采用单个输入参数,一个布尔值。调用方法 withtrue启用空事件排队;传递false给该方法会禁用此类排队。

返回值

没有

Ndb::set_eventbuf_max_alloc()

描述

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

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

签名
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 7.3.6 开始,您可以设置一个任意的、人类可读的名称来标识Ndb 用于调试目的的对象。然后可以使用 检索此名称 getNdbObjectName()。(缺陷 #18419907)这必须在调用 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

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

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

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

    如果xfrmbufNULL(默认值),则根据需要自动调用 malloc()or free()startTransaction()如果 xfrmbuf不是 NULL并且 xfrmbuflen太小则失败。

  • 缓冲区的长度。

返回值

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

例子

假设表的分区键是单列 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;
笔记

您还可以指定一个缓冲区来避免显式调用malloc()and free()调用,但是为该缓冲区计算一个合适的大小并不是一件简单的事情;如果缓冲区不是NULL但它的长度太短,则 startTransaction() 调用失败。但是,如果您选择指定缓冲区,通常 1 MB 就足够了。

现在,当您开始交易时,您可以直接访问包含所需信息的节点。

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

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

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

仍然可以像以前一样使用此方法,而无需指定事务协调器。在任何一种情况下,您仍然必须显式关闭事务,无论调用是否startTransaction()成功。