本節提供有關 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()
即可。 事件程式碼不會檢查表格綱要版本。當刪除表格時,請務必刪除任何相關的事件。
-
如果您已收到完整的 epoch,即使發生節點故障,來自此 epoch 的事件也不會重新傳送。但是,如果發生節點故障,後續的 epoch 可能會包含重複的事件,這些事件可以通過重複的主鍵來識別。
在 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
。
- 描述
-
此方法用於代替 blob 屬性的
getValue()
。此方法返回的 blob 控制代碼 (NdbBlob
) 僅支援讀取操作。若要取得 blob 屬性的先前值,請使用
getPreBlobHandle()
。 - 簽名
NdbBlob* getBlobHandle ( const char* name )
- 參數
blob 屬性的
name
。- 回傳值
指向
NdbBlob
物件的指標。
- 描述
-
取得最近檢索的事件資料的 epoch。
此方法是在 NDB 7.4 中新增的,它取代了
getGCI()
,後者現在已過時,並可能在未來的 NDB Cluster 版本中移除。 - 簽名
Uint64 getEpoch ( void ) const
- 參數
無.
- 回傳值
epoch 號碼 (整數)。
- 描述
-
此方法用於取得事件的類型 (
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。
此方法會返回最新的 epoch 號碼。
使用此方法取得的 GCI 不一定與事件相關聯。
此方法在 NDB 7.4 中已過時,並可能在未來版本中移除。在 NDB 7.4 及更新版本中,請改用
Ndb::getHighestQueuedEpoch()
。 - 簽名
Uint64 getLatestGCI ( void ) const
- 參數
無.
- 回傳值
最新整體檢查點的索引,整數。
- 描述
此函數與
getBlobHandle()
相同,不同之處在於它用於存取 blob 屬性的先前值。請參閱 NdbEventOperation::getBlobHandle()。- 簽名
NdbBlob* getPreBlobHandle ( const char* name )
- 參數
blob 屬性的
name
。- 回傳值
指向
NdbBlob
的指標。
- 描述
此方法的執行方式與
getValue()
完全相同,不同之處在於它用於定義屬性先前值的檢索操作,而不是目前的值。- 簽名
NdbRecAttr* getPreValue ( const char* name, char* value = 0 )
- 參數
-
此方法採用此處列出的兩個參數
屬性的
name
(作為常數字元指標)。-
指向
value
的指標,使得如果屬性值不是
NULL
,則會在此參數中返回屬性值。如果屬性值為
NULL
,則屬性值僅儲存在此方法返回的NdbRecAttr
物件中。
如需關於此參數的詳細資訊,請參閱
value
緩衝區記憶體配置。
- 回傳值
用於保存屬性值的
NdbRecAttr
物件,或指示發生錯誤的NULL
指標。
- 描述
-
此方法會定義屬性值的檢索。
NDB API
會為要保存返回的屬性值的NdbRecAttr
物件配置記憶體。此方法不會從資料庫擷取屬性值,並且在呼叫
execute()
方法且Ndb::nextEvent()
返回非NULL
值之前,此方法返回的NdbRecAttr
物件是無法讀取或列印的。如果特定屬性未變更,則對應的
NdbRecAttr
將處於UNDEFINED
狀態。可以使用NdbRecAttr::isNULL()
進行檢查,在這種情況下,它會返回-1
。getValue()
會檢索目前的值。請使用getPreValue()
來檢索先前的值。 - 簽名
NdbRecAttr* getValue ( const char* name, char* value = 0 )
- 參數
-
此方法採用此處列出的兩個參數
屬性的
name
(作為常數字元指標)。-
指向
value
的指標,使得如果屬性值不是
NULL
,則會在此參數中返回屬性值。如果屬性值為
NULL
,則屬性值僅儲存在此方法返回的NdbRecAttr
物件中。
如需關於此參數的詳細資訊,請參閱
value
緩衝區記憶體配置。
- 回傳值
用於保存屬性值的
NdbRecAttr
物件,或指示發生錯誤的NULL
指標。
value
緩衝區記憶體配置。 應用程式有責任為 value
緩衝區 (如果不是 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
。
- 描述
-
此方法用於判斷已取用的事件資料是否標示空的 epoch。
此方法是在 NDB 7.4 中新增的。
- 簽名
bool isEmptyEpoch ( void )
- 參數
無.
- 回傳值
如果此 epoch 為空,則此方法會返回
true
;否則,會返回false
。
- 描述
-
此方法用於判斷已取用的事件資料是否標示空的 epoch。
此方法是在 NDB 7.4 中新增的。
- 簽名
bool isErrorEpoch ( NdbDictionary::Event::TableEvent* error_type = 0 )
- 參數
如果此為錯誤 epoch,
error_type
會包含對應於錯誤的TableEvent
值。- 回傳值
如果此 epoch 發生錯誤,則此方法會返回
true
;否則,會返回false
。
- 描述
此方法用於判斷是否由於緩衝區溢位而發生事件遺失。
- 簽名
bool isOverrun ( void ) const
- 參數
無.
- 回傳值
如果事件緩衝區已溢位,則此方法會返回
true
,否則,會返回false
。
- 描述
-
此方法用於設定合併事件旗標。有關事件合併的資訊,請參閱 Event::mergeEvents()。
合併事件旗標預設為
false
。 - 簽名
void mergeEvents ( bool flag )
- 參數
一個布林值
flag
。- 回傳值
無.
本節提供有關 State
資料類型的資訊。
- 描述
-
此類型描述事件操作的狀態。
State
值由getState()
方法傳回。 - 列舉值
-
下表顯示可能的值,以及說明。
表 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
。