文件首頁
MySQL NDB Cluster API 開發人員指南
相關文件 下載本手冊
PDF (美式信紙) - 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 引入以 epoch 為基礎的事件 API,取代先前的以 GCI 為基礎的模型。新版本的 API 也簡化了錯誤偵測與處理。這些變更藉由為 NdbNdbEventOperation 實作一些新方法、棄用這兩個類別的數個其他方法,以及將新的類型值新增至 TableEvent 來實作在 NDB API 中。

某些新方法直接取代或替代已棄用的方法,但並非所有已棄用的方法都會對應至新的方法,其中有些是完全新的。舊 (已棄用) 方法顯示在下表的第一欄中,而新方法則顯示在第二欄中;對應至新方法的舊方法顯示在同一列中。


使用新 API 的錯誤處理,藉由檢查從 getEventType2() 傳回的值來完成,而且不再使用方法 hasError()clearError() 來處理,這些方法現在已棄用,而且可能會在 NDB Cluster 的未來版本中移除。為了支援此變更,TableEvent 類型的可能範圍已由此處列出的類型擴充

  • TE_EMPTY:空的 epoch

  • TE_INCONSISTENT:不一致的 epoch;遺失資料或溢位

  • 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() 傳回的值。

  • 欄位的名稱 (以常數字元指標表示)。

回傳值

.

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 建構子

說明

Event 建構子會建立一個具有指定名稱的新實例,並且可以選擇性地與資料表相關聯。

您應該記住,NDB API 不會追蹤已配置的事件物件,這表示使用者必須在不再使用 Event 後明確刪除它。

簽名

可以使用兩種方式調用此方法,第一種方式僅按名稱調用,如下所示

Event
    (
      const char* name
    )

或者,您可以使用事件名稱和相關聯的資料表,如下所示

Event
    (
      const char*                  name,
      const NdbDictionary::Table& table
    )
參數

至少需要事件的名稱 (以常數字元指標表示)。您可以選擇性地將事件與資料表相關聯;此引數 (如果存在) 是對 Table 物件的參考 (請參閱 第 2.3.27 節,「Table 類別」)。

回傳值

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())。

回傳值

指向對應於 noColumn 的指標。

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 節,「Table 類別」。)

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 事件將作為主要資料表事件的一部分進行處理。

  • 可以透過 NdbBlob 方法以單一值形式讀取來自 blob 部分事件的 blob 後置/前置資料。

    此旗標不會由 NdbEventOperation 繼承,必須在 NdbEventOperation 上明確設定。

簽名
void mergeEvents
    (
      bool 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
    )
參數

要提供給事件的名稱 (以常數字元指標表示)。

回傳值

.

Event::setTable()

說明

此方法會定義要在其上偵測事件的資料表。

預設情況下,事件偵測會發生在表格中的所有欄位。使用 addEventColumn() 來覆寫此行為。詳細資訊請參閱 Event::addEventColumn()

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

您也可以在此方法中使用指標,如下所示

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

當這樣使用時,如果表格指標為 NULL,此版本的 setTable() 會回傳 -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 從資料節點接收到的空 epoch
TE_INCONSISTENT 資料節點中遺失資料或緩衝區溢位
TE_OUT_OF_MEMORY 事件緩衝區溢位
TE_ALL 當表格上發生任何事件時發生(當接收到特定事件時不相關)

TE_EMPTYTE_INCONSISTENTTE_OUT_OF_MEMORY 是在 NDB 7.4 中新增的。