共用方式為


在 Oracle 資料庫配接器中接收輪詢型數據變更訊息

Microsoft BizTalk Adapter for Oracle Database 支援藉由輪詢 Oracle 資料庫來接收因輪詢導致資料變更的訊息。 配接器會透過下列方式將訊息傳遞至您的應用程式:

  • 執行 SQL SELECT 查詢,以判斷數據是否可供輪詢。 您可以設定配接器定期或持續執行 SQL SELECT 查詢。

  • 針對 Oracle 資料表或檢視執行 SQL SELECT 查詢,或執行預存程式、函式或封裝程式和函式。

  • 在 Oracle 資料庫上執行選擇性的輪詢後 PL/SQL 程式代碼區塊。 此程式代碼區塊通常用於更新目標中查詢記錄上的欄位,或將查詢的記錄移至另一個數據表或檢視表。

  • 透過呼叫 POLLINGSTMT 作業,或呼叫那些作為輪詢操作公開的預存程式、函數及封裝的程序和函數,來傳回結果集中查詢的結果。

    配接器會在 Oracle 交易內執行所有這些作業。

    配接器也可讓您藉由在連線 URI 中公開 PollingId 參數,以接收相同應用程式中多個 Oracle 成品的數據變更訊息。 此參數會修改 POLLINGSTMT 作業的目標命名空間。

變更 POLLINGSTMT 的目標命名空間

您可以在連線 URI 中設定 PollingId 查詢字串參數,以修改 POLLINGSTMT 作業的目標命名空間。 如果在連接 URI 中指定了 PollingId,Oracle 資料庫適配器會將 PollingId 參數中指定的字串附加到 POLLINGSTMT 作業的預設目標命名空間:http://microsoft.lobservices.oracledb/2007/03/POLLINGSTMT。 不會修改 POLLINGSTMT 作業的訊息動作。

例如,如果指定下列連線 URI:

OracleDb://User=SCOTT;Password=TIGER@Adapter?PollingId=AcctActivity

目標命名空間如下:

http:/microsoft.lobservices.oracledb/2007/03/POLLINGSTMTAcctActivity

謹慎

此範例或指引會參考敏感性資訊,例如連接字串或使用者名稱和密碼。 請勿在程式代碼中硬式編碼這些值,並確定您使用最安全的驗證來保護機密數據。 如需詳細資訊,請參閱下列文件:

您可以為每個 POLLINGSTMT 作業提供唯一的命名空間,以接收應用程式中多個 Oracle 資料表和檢視的數據變更訊息。

如需 Oracle 資料庫配接器連線 URI 的詳細資訊,請參閱 建立 Oracle 資料庫連線 URI

使用系結屬性接收數據變更的訊息

您可以藉由設定下列部分或所有系結屬性,設定 Oracle Database 配接器來接收數據變更的訊息。

綁定屬性 價值觀 預設 必要/選擇性
InboundOperationType 請確定值已設定為 輪詢 投票 必須的。 如果未明確設定,則會套用預設值。
PolledDataAvailableStatement 指定要執行的 SELECT 語句,以確定是否有任何資料可用於查詢特定資料表。 指定的語句必須傳回包含數據列和數據行的結果集。 結果集第一個單元格中的值會指出配接器是否執行 針對PollingStatement系結 屬性指定的值。 如果結果的第一個儲存格包含正值,配接器就會執行輪詢語句。 例如,這個系結屬性的有效語句會是:

Select * from <table_name>

注意: 您不得指定這個系結屬性的預存程式。 此外,這個語句不得修改基礎 Oracle 資料庫。
SELECT 1 FROM DUAL 必須的。 如果未明確設定,則會套用預設值,這表示無論輪詢的數據表是否有數據,配接器都必須繼續輪詢。
PollingAction 指定輪詢作業的動作。 您可以使用「取用配接器服務」附加元件為操作產生的元數據,判斷特定操作的輪詢動作。 可選擇地使用 SELECT 語句在資料表和檢視表上進行輪詢的作業。
PollingInterval 設定為間隔,以秒為單位,您希望配接器查詢 Oracle 資料庫。 這個屬性會指定輪詢間隔和輪詢交易逾時。此值應該大於在 Oracle 資料庫上執行查詢和輪詢後語句所需的時間量,加上客戶端處理查詢數據並傳迴輪詢回應消息所需的時間量。 500 必須的。 如果未明確設定,則會套用預設值。
PollingStatement 指定下列任一項:

- 應針對 Oracle 資料庫執行的 SQL SELECT 語句。 此語句應該包含 FOR UPDATE 子句。 如需 FOR UPDATE 子句的相關資訊,請參閱在本主題後面的 Polling 語句中指定 FOR UPDATE 子句

- 請求要輪詢的封裝內的預存程序、函式,或一般程序或函式的訊息。
必須的。 將 PollingStatement 設定為非 Null 值會啟用輪詢。
PollWhileDataFound 指定如果正在輪詢的數據表中有數據可用,Oracle 資料庫配接器是否忽略輪詢間隔並持續輪詢 Oracle 資料庫。 如果數據表中沒有可用的數據,配接器會還原為在指定的輪詢間隔執行 SQL 語句 必須的。 如果未明確設定,則會套用預設值。
PostPollStatement 設定為選擇性的 PL/SQL 程式代碼區塊,此區塊會在執行查詢之後由配接器執行,但在查詢數據傳回至用戶端之前。 選擇性。 如果未指定任何值,就不會執行 post poll 語句。

備註

如果您使用 WCF 服務模型或 WCF 通道模型,您也必須設定 AcceptCredentialsInUri 系結屬性。

在輪詢語句中輸入 FOR UPDATE

如果您使用 SELECT 語句做為輪詢語句,並執行會影響 SELECT 語句中所指定數據列的輪詢後語句,則必須在輪詢語句中使用 FOR UPDATE 子句。 指定 FOR UPDATE 子句可確保查詢語句所選取的記錄在交易期間被鎖定,並且查詢結束後的語句可以對其進行任何必要的更新。

謹慎

您可以在輪詢和輪詢後語句之間的時間範圍中,將更多記錄新增至符合輪詢後語句條件的數據表。 在這種情況下,輪詢後語句會更新滿足條件的所有記錄,而不只是在輪詢語句中選取的記錄。

如果指定了輪詢後語句,而且輪詢語句不包含 FOR UPDATE 子句,您將會遇到下列兩個條件之一:

  • 如果 TransactionIsolationLevel 設定為 ReadCommitted,輪詢後查詢將不會更新選取的數據列。

  • 如果 TransactionIsolationLevel 設定為 Serializable,當執行輪詢後語句時,會發生下列目標系統例外狀況(Microsoft.ServiceModel.Channels.Common.TargetSystemException):“ORA-08177 無法串行化此交易的存取權”。 在這種情況下,您必須設定 PollingRetryCount 系結屬性,以定義您想要配接器重試相同交易的次數。

    如需如何設定交易隔離等級的指示,請參閱 使用 Oracle Database 設定交易隔離等級和交易逾時

    如果配接器用戶端設定為使用交易,並且在配接器中將 UseAmbientTransaction 系結屬性的值設定為 True,則輪詢和輪詢後的語句將在交易中執行。

    使用 FOR UPDATE 選項的輪詢查詢範例如下:

SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE  

在輪詢語句中加入 NOWAIT 子句

您可能會遇到同時執行的線程存取被輪詢的資料表的情況,導致資料表中發生過多的內容爭用。 這可能會導致輪詢查詢遭到封鎖,以取得數據表數據列的鎖定。 如果您使用 SELECT 語句做為輪詢語句,您可能會想要在 SELECT 語句中指定 NOWAIT 關鍵詞以及 FOR UPDATE 關鍵詞。 如果輪詢查詢嘗試選取的資料列被鎖定,這會導致配接器內的輪詢查詢執行立即返回。 Oracle 通常會在這類情況下拋出例外。 同樣地,配接器用戶端可能會使用 PollingInterval 系結屬性來指定配接器客戶端必須重試輪詢數據的時間間隔。

具有NOWAIT 選項的輪詢查詢范例如下:

SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE NOWAIT  

在輪詢語句中加入 SKIP LOCKED 子句

您可能會遇到一些情境,由於並行執行緒存取正在輪詢的資料表,輪詢查詢中所指定的 WHERE 子句結果集中的某些行可能會被鎖定。 例如,您的輪詢查詢會從資料表返回 6 筆資料列;其中有 4 筆已因其他交易而鎖定。 在此情況下,您可能會想要指定 SKIP LOCKED 關鍵詞以及 FOR UPDATE 關鍵詞,以指示資料庫嘗試鎖定 WHERE 子句所指定的數據列,並略過已鎖定的任何數據列。 WHERE 子句中解除鎖定的數據列會在交易期間鎖定,而輪詢後語句可以對其執行任何必要的更新,這樣這些數據列就不會再次輪詢。 這可確保您在 WHERE 子句所指定的所有資料列解除鎖定之前,不必等到接收輪詢訊息。

SKIP LOCKED 關鍵詞適用於當您在多部計算機上有適配器用戶端對資料庫中相同的資料表進行輪詢的場景。 您可以藉由設定輪詢作業,在適配器客戶端之間進行負載平衡,這樣您就能接收 WHERE 子句所指定、在當下時間點已解除鎖定的資料列的輪詢式資料變更訊息,然後更新資料列,以確保如果一個適配器客戶端收到了輪詢型資料變更訊息,其他客戶端不會收到相同的訊息。

使用 SKIP LOCKED 選項的輪詢查詢範例如下:

SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE SKIP LOCKED  

支援有序傳遞(FIFO)

在生產環境中,輪詢可用來監視 Oracle 資料庫中的數據變更。 配接器用戶端會使用 Oracle 資料庫配接器來接收這些數據變更的訊息。 根據業務場景,數據變更的訊息能否以正確的順序被適配器客戶端接收至關重要。

Oracle Database 配接器支援已排序的傳遞或先出(FIFO),以維護從 Oracle 資料庫接收訊息的順序。 以下是一些與 Oracle 資料庫配接器輸入案例中 FIFO 支援相關的考慮。

  • 如果協調流程正在取用訊息,協調流程必須針對來自 Oracle Database 配接器接收埠的訊息設定已排序的傳遞集。

  • 如果傳送埠在內容型路由案例中取用訊息,則傳送埠必須已針對來自 Oracle Database 配接器接收埠的訊息設定已排序傳遞。

    WCF-Custom 或 WCF-OracleDB 配接器具有屬性 [失敗時暫停要求訊息 ],指定是否要暫停失敗輸入處理的要求訊息。 此屬性可以在 [錯誤處理] 區段底下的 [訊息] 索引標籤上設定 WCF-Custom 或 WCF-OracleDB 接收埠。 下表列出不同案例,說明如何根據此屬性的設定及訊息訂閱者的狀態(協調流程或埠)來處理傳入訊息。

埠屬性 未列在清單中的訂閱者 已登記但已停止狀態的訂閱者
「失敗時暫停要求訊息」屬性未設置 - 路由失敗報告會產生為暫停處理的(無法恢復的訊息)

- 未暫停實際訊息

- 輪詢後查詢因交易被中止而未執行。 因此,輪詢會重複並再次擷取數據列。

- 事件記錄檔中報告的錯誤,以描述所發生的情況。
- 未視為「失敗」。 事件記錄檔中沒有任何錯誤訊息。

- 實際訊息會放入暫停的(可繼續的)佇列中。

- 當訂閱通訊埠或流程調控啟動時,訊息將自動恢復。 如果訂閱者設定了預定的遞送,我們將遵守該安排。

訊息也可以手動恢復。
"在失敗時暫停請求消息"屬性已被設置 - 路由失敗報告會以暫停(無法繼續)的訊息形式產生

- 實際訊息也會暫停

- 由於交易中止,後續查詢不會被執行。 因此,輪詢會重複並再次擷取數據列。

- 事件記錄檔中報告的錯誤,以描述所發生的情況。
- 未視為「失敗」。 事件記錄檔中沒有任何錯誤訊息。

- 實際訊息會放入可恢復的暫停佇列中。

- 當訂閱通訊埠或協調流程啟動時,訊息會自動恢復。 如果在訂閱者上設定已排序的傳遞,則會接受。

- 訊息的傳送也可以手動恢復。

另請參閱

開發 Oracle 資料庫應用程式
使用 BizTalk Server 輪詢 Oracle 資料庫
使用 WCF 服務模型接收 Oracle 資料庫中以輪詢為基礎的數據變更訊息
使用 WCF 通道模型接收 Oracle 資料庫中以輪詢為基礎的數據變更訊息