在 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 資料庫配接器來接收資料變更的訊息。
Binding 屬性 | 值 | 預設 | 必要/選用 |
---|---|---|---|
InboundOperationType | 請確定此值已設定為 Polling。 | 輪詢 | 必要。 如果未明確設定,則會套用預設值。 |
PolledDataAvailableStatement | 指定執行的 SELECT 語句,以判斷是否有任何資料可用於輪詢特定資料表。 指定的語句必須傳回包含資料列和資料行的結果集。 結果集第一個儲存格中的值會指出配接器是否執行 針對 PollingStatement 系結屬性指定的值。 如果結果的第一個儲存格包含正值,配接器會執行輪詢語句。 例如,這個系結屬性的有效語句將是:Select * from <table_name> 注意: 您不得指定這個系結屬性的預存程式。 此外,此語句不得修改基礎 Oracle 資料庫。 |
SELECT 1 FROM DUAL | 必要。 如果未明確設定,則會套用預設值,這表示不論輪詢的資料表是否有資料,配接器都必須繼續輪詢。 |
PollingAction | 指定輪詢作業的動作。 您可以從您使用取用配接器服務增益集為作業產生的中繼資料,判斷特定作業的輪詢動作。 | null | 選擇性地使用 SELECT 語句輪詢資料表和檢視表的作業。 |
PollingInterval | 設定為間隔,以秒為單位,您希望配接器查詢 Oracle 資料庫。 這個屬性會指定輪詢間隔和輪詢交易逾時。如果已在 Oracle 資料庫上) 指定查詢和輪詢後語句所花費的時間量,以及用戶端處理查詢資料並傳回輪詢回應訊息所花費的時間量,則此值應該大於 (。 | 500 | 必要。 如果未明確設定,則會套用預設值。 |
PollingStatement | 指定下列任一項: - 應該針對 Oracle 資料庫執行的 SQL SELECT 語句。 此語句應該包含 FOR UPDATE 子句。 如需 FOR UPDATE 子句的相關資訊,請參閱本主題稍後 的 Polling 語句中指定 FOR UPDATE 子句 。 - 在您要輪詢的封裝內,要求預存程式、函式或程式或函式的訊息。 |
null | 必要。 將 PollingStatement 設定為非 Null 值會啟用輪詢。 |
PollWhileDataFound | 指定如果輪詢資料表中有可用的資料,Oracle 資料庫配接器是否忽略輪詢間隔,並持續輪詢 Oracle 資料庫。 如果資料表中沒有可用的資料,配接器會還原為在指定的輪詢間隔執行 SQL 語句 | False | 必要。 如果未明確設定,則會套用預設值。 |
PostPollStatement | 設定為選擇性的 PL/SQL 程式碼區塊,該區塊會在執行查詢之後由配接器執行,但在查詢資料傳回用戶端之前。 | null | 選擇性。 如果未指定任何值,則不會執行 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 個數據列;這些 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 資料庫配接器支援已排序的傳遞或先出 (FIFO) ,以維護從 Oracle 資料庫接收訊息的順序。 以下是一些與 Oracle 資料庫配接器輸入案例中 FIFO 支援相關的考慮。
如果協調流程正在使用訊息,協調流程必須針對來自 Oracle 資料庫配接器接收埠的訊息設定已排序的傳遞。
如果在內容型路由) 案例中傳送埠 (取訊息,則傳送埠必須已針對來自 Oracle 資料庫配接器接收埠的訊息進行排序傳遞集。
WCF-Custom 或 WCF-OracleDB 配接器的屬性 在失敗時暫停要求訊息 ,指定是否暫停失敗輸入處理的要求訊息。 此屬性可以在 [錯誤處理] 區段下的 [訊息] 索引標籤上設定 WCF-Custom 或 WCF-OracleDB 接收埠。 下表列出案例,說明如何根據此屬性設定,以及訊息訂閱者的狀態 (協調流程或埠) 來處理傳入訊息。
Port 屬性 | 處於未列出的狀態訂閱者 | 已登記但已停止狀態的訂閱者 |
---|---|---|
未設定失敗屬性時暫停要求訊息 | - 路由失敗報告會產生為暫停的 (不可繼續訊息) - 實際訊息未暫停 - 輪詢後查詢不會因為交易中止而執行。 因此輪詢會重複並再次擷取資料列。 - 事件記錄檔中報告的錯誤,以描述發生的情況。 |
- 未視為「失敗」。 事件記錄檔中沒有錯誤訊息。 - 實際訊息會放入暫停的 (可繼續) 佇列中。 - 訂閱埠或協調流程啟動時,會自動繼續訊息。 如果在訂閱者上設定已排序的傳遞,則會接受它。 - 訊息也可以手動繼續。 |
在失敗屬性 IS 設定時暫停要求訊息 | - 路由失敗報告會產生為暫停的 (不可繼續訊息) - 實際訊息也會暫停 - 輪詢後查詢不會因為交易中止而執行。 因此輪詢會重複並再次擷取資料列。 - 事件記錄檔中報告的錯誤,以描述發生的情況。 |
- 未視為「失敗」。 事件記錄檔中沒有錯誤訊息。 - 實際訊息會放入暫停的 (可繼續) 佇列中。 - 訂閱埠或協調流程啟動時,會自動繼續訊息。 如果在訂閱者上設定已排序的傳遞,則會接受它。 - 訊息也可以手動繼續。 |
另請參閱
開發您的 Oracle 資料庫應用程式
使用 BizTalk Server 輪詢 Oracle 資料庫
使用 WCF 服務模型在 Oracle 資料庫中接收輪詢型資料變更訊息
使用 WCF 通道模型在 Oracle 資料庫中接收輪詢型資料變更訊息