Empfangen von abfragenbasierten datenveränderten Nachrichten im Oracle Database-Adapter
Der Microsoft BizTalk-Adapter für Oracle-Datenbank unterstützt den Empfang von abrufbasierten datenveränderten Nachrichten durch Abfragen der Oracle-Datenbank. Der Adapter übermittelt die Nachrichten an Ihre Anwendung wie folgt:
Ausführen einer SQL SELECT-Abfrage, um zu bestimmen, ob Daten für die Abfrage verfügbar sind. Sie können den Adapter so konfigurieren, dass die SQL SELECT-Abfrage regelmäßig oder kontinuierlich ausgeführt wird.
Ausführen einer SQL SELECT-Abfrage für eine Oracle-Tabelle oder -Sicht oder Ausführung gespeicherter Prozeduren, Funktionen oder verpackter Prozeduren und Funktionen.
Ausführen eines optionalen PL/SQL-Codeblocks nach der Abfrage in der Oracle-Datenbank. Dieser Codeblock wird häufig verwendet, um ein Feld für die abgefragten Datensätze im Ziel zu aktualisieren oder die abgefragten Datensätze in eine andere Tabelle oder Sicht zu verschieben.
Das Zurückgeben der Abfrage führt zu einem Resultset, indem der POLLINGSTMT-Vorgang oder die gespeicherten Prozeduren, Funktionen oder verpackten Prozeduren und Funktionen aufgerufen werden, die als Abrufvorgänge verfügbar gemacht werden.
Der Adapter führt alle diese Vorgänge innerhalb einer Oracle-Transaktion aus.
Mit dem Adapter können Sie außerdem Nachrichten zu Datenänderungen für mehrere Oracle-Artefakte in derselben Anwendung empfangen, indem Sie einen
PollingId
Parameter im Verbindungs-URI verfügbar machen. Dieser Parameter ändert den Zielnamespace des POLLINGSTMT-Vorgangs.
Ändern des Zielnamespaces von POLLINGSTMT
Sie können den Zielnamespace des POLLINGSTMT-Vorgangs ändern, indem Sie den PollingId
Abfragezeichenfolgenparameter im Verbindungs-URI festlegen. Wenn ein PollingId
im Verbindungs-URI angegeben ist, fügt der Oracle Database-Adapter die im Parameter angegebene Zeichenfolge an den PollingId
Standardzielnamespace für den POLLINGSTMT-Vorgang an: http://microsoft.lobservices.oracledb/2007/03/POLLINGSTMT
. Die Nachrichtenaktion des POLLINGSTMT-Vorgangs wird nicht geändert.
Wenn beispielsweise der folgende Verbindungs-URI angegeben ist: OracleDb://User=SCOTT;Password=TIGER@Adapter?PollingId=AcctActivity
, lautet http:/microsoft.lobservices.oracledb/2007/03/POLLINGSTMTAcctActivity
der Zielnamespace .
Wenn Sie einen eindeutigen Namespace für jeden POLLINGSTMT-Vorgang bereitstellen, können Sie datenveränderte Nachrichten für mehrere Oracle-Tabellen und -Ansichten in Ihrer Anwendung erhalten.
Weitere Informationen zum Oracle Database-Adapterverbindungs-URI finden Sie unter Erstellen des Oracle Database-Verbindungs-URI.
Empfangen von datenveränderten Nachrichten mithilfe von Bindungseigenschaften
Sie konfigurieren den Oracle Database-Adapter für den Empfang von datenveränderten Nachrichten, indem Sie einige oder alle der folgenden Bindungseigenschaften festlegen.
Bindungseigenschaft | Wert | Standard | Erforderlich/Optional |
---|---|---|---|
InboundOperationType | Stellen Sie sicher, dass der Wert auf Polling festgelegt ist. | Abruf | Erforderlich. Wenn nicht explizit festgelegt wird, gilt der Standardwert. |
PolledDataAvailableStatement | Geben Sie die ausgeführte SELECT-Anweisung an, um zu bestimmen, ob Daten für die Abfrage einer bestimmten Tabelle verfügbar sind. Die angegebene Anweisung muss ein Resultset zurückgeben, das aus Zeilen und Spalten besteht. Der Wert in der ersten Zelle des Resultsets gibt an, ob der Adapter den für die Eigenschaft PollingStatement-Bindung angegebenen Wert ausführt. Wenn die erste Zelle des Ergebnisses einen positiven Wert enthält, führt der Adapter die Abfrage-Anweisung aus. Eine gültige Anweisung für diese Bindungseigenschaft lautet beispielsweise:Select * from <table_name> Hinweis: Sie dürfen keine gespeicherten Prozeduren für diese Bindungseigenschaft angeben. Außerdem darf diese Anweisung die zugrunde liegende Oracle-Datenbank nicht ändern. |
WÄHLEN SIE 1 AUS DUAL AUS | Erforderlich. Wenn nicht explizit festgelegt, gilt der Standardwert. Dies bedeutet, dass der Adapter die Abfrage unabhängig davon fortsetzen muss, ob die abgefragte Tabelle Daten enthält oder nicht. |
PollingAction | Gibt die Aktion für den Abrufvorgang an. Sie können die Abfrageaktion für einen bestimmten Vorgang anhand der Metadaten ermitteln, die Sie für den Vorgang generieren, indem Sie das Add-In Adapterdienst nutzen verwenden. | NULL | Optional für Abfragen von Vorgängen in Tabellen und Sichten mithilfe der SELECT-Anweisung. |
PollingInterval | Legen Sie auf das Intervall in Sekunden fest, in dem der Adapter die Oracle-Datenbank abfragen soll. Diese Eigenschaft gibt das Abfrageintervall und das Timeout der Abfragetransaktion an. Der Wert sollte größer sein als die Zeit, die zum Ausführen der Abfrage und nach der Abfrage (sofern angegeben) in der Oracle-Datenbank benötigt wird, sowie die Zeit, die der Client benötigt, um die Abfragedaten zu verarbeiten und die Antwortnachricht zurückzugeben. | 500 | Erforderlich. Wenn nicht explizit festgelegt wird, gilt der Standardwert. |
PollingStatement | Geben Sie eine der folgenden Optionen an: – SQL SELECT-Anweisung, die für die Oracle-Datenbank ausgeführt werden soll. Diese Anweisung sollte eine FOR UPDATE-Klausel enthalten. Informationen zur FOR UPDATE-Klausel finden Sie weiter unten in diesem Thema unter Angeben einer FOR UPDATE-Klausel in der Polling-Anweisung . – Fordern Sie eine Nachricht für eine gespeicherte Prozedur, Funktion oder Funktion in einem Paket an, das abgefragt werden soll. |
NULL | Erforderlich. Wenn PollingStatement auf einen Wert ungleich NULL festgelegt wird, wird die Abfrage aktiviert. |
PollWhileDataFound | Gibt an, ob der Oracle Database-Adapter das Abfrageintervall ignoriert und kontinuierlich die Oracle-Datenbank abruft, wenn Daten in der abgefragten Tabelle verfügbar sind. Wenn keine Daten in der Tabelle verfügbar sind, wird der Adapter wiederherstellen, um die SQL-Anweisung im angegebenen Abrufintervall auszuführen. | False | Erforderlich. Wenn nicht explizit festgelegt wird, gilt der Standardwert. |
PostPollStatement | Legen Sie auf einen optionalen PL/SQL-Codeblock fest, der vom Adapter ausgeführt wird, nachdem die Abfrage ausgeführt wurde, aber bevor die Abfragedaten an den Client zurückgegeben werden. | NULL | Optional. Wenn kein Wert angegeben wird, wird eine Post-Poll-Anweisung nicht ausgeführt. |
Hinweis
Wenn Sie das WCF-Dienstmodell oder das WCF-Kanalmodell verwenden, müssen Sie auch die AcceptCredentialsInUri-Bindungseigenschaft festlegen.
Geben Sie einen FOR UPDATE-Wert in der Abfrage-Anweisung ein.
Wenn Sie eine SELECT-Anweisung als Abfrage-Anweisung verwenden und eine Anweisung nach der Abfrage ausführen, die sich auf die in der SELECT-Anweisung angegebenen Zeilen auswirkt, müssen Sie die FOR UPDATE-Klausel in der Abfrage-Anweisung verwenden. Wenn Sie eine FOR UPDATE-Klausel angeben, wird sichergestellt, dass die von der Abfrage-Anweisung ausgewählten Datensätze während der Transaktion gesperrt werden und dass die Anweisung nach der Abfrage alle erforderlichen Updates für sie ausführen kann.
Achtung
Sie können Szenarien haben, in denen im Zeitfenster zwischen den Anweisungen zur Abfrage und nach der Abfrage der Tabelle weitere Datensätze hinzugefügt werden, die die Bedingung der Post-Poll-Anweisung erfüllen. In solchen Situationen aktualisiert die Anweisung nach der Abfrage alle Datensätze, die die Bedingung erfüllen, und nicht nur die Datensätze, die als Teil der Abfrage-Anweisung ausgewählt wurden.
Wenn eine Anweisung nach der Abfrage angegeben wird und die Abfrage-Anweisung keine FOR UPDATE-Klausel enthält, tritt eine der folgenden beiden Bedingungen auf:
Wenn TransactionIsolationLevel auf ReadCommitted festgelegt ist, aktualisiert die Abfrage nach der Abfrage die ausgewählten Zeilen nicht.
Wenn TransactionIsolationLevel auf Serialisierbar festgelegt ist, tritt die folgende Zielsystemausnahme (Microsoft.ServiceModel.Channels.Common.TargetSystemException) auf, wenn die Anweisung nach der Abfrage ausgeführt wird: "ORA-08177 kann den Zugriff für diese Transaktion nicht serialisieren". In einem solchen Fall müssen Sie die PollingRetryCount-Bindungseigenschaft festlegen, um zu definieren, wie oft der Adapter dieselbe Transaktion wiederholen soll.
Anweisungen zum Festlegen der Transaktionsisolationsstufe finden Sie unter Konfigurieren der Transaktionsisolationsstufe und des Transaktionstimeouts mit Oracle Database.
Die Abfrage- und Nachabfrageanweisungen werden in einer Transaktion ausgeführt, wenn die Adapterclients für die Verwendung von Transaktionen konfiguriert haben und der Wert der UseAmbientTransaction-Bindungseigenschaft im Adapter auf True festgelegt ist.
Ein Beispiel für eine Abfrage mit der OPTION FOR UPDATE ist:
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE
Geben Sie eine NOWAIT-Klausel in der Abfrage-Anweisung ein.
Möglicherweise gibt es Szenarien, in denen gleichzeitige Threads auf die abgefragte Tabelle zugreifen, was zu zu vielen Konflikten in der Tabelle führt. Dies kann dazu führen, dass die Abfrage blockiert wird, um eine Sperre für Tabellenzeilen zu erhalten. Wenn Sie eine SELECT-Anweisung als Abruf-Anweisung verwenden, können Sie eine NOWAIT-Schlüsselwort (keyword) zusammen mit der FOR UPDATE-Schlüsselwort (keyword) in der SELECT-Anweisung angeben. Dies führt dazu, dass die Abfrageausführung innerhalb des Adapters sofort zurückgegeben wird, wenn es Sperren für Zeilen gibt, die die Abfrageabfrage auszuwählen versucht. Eine Ausnahme wird normalerweise von Oracle unter solchen Bedingungen ausgelöst. Auch hier können Adapterclients die PollingInterval-Bindungseigenschaft verwenden, um das Zeitintervall anzugeben, nach dem die Adapterclients erneut versuchen müssen, die Daten abzufragen.
Ein Beispiel für eine Abfrage mit der NOWAIT-Option ist:
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE NOWAIT
Geben Sie eine SKIP LOCKED-Klausel in der Abfrage-Anweisung ein.
Möglicherweise gibt es Szenarien, in denen aufgrund gleichzeitiger Threads, die auf die abgefragte Tabelle zugreifen, einige Zeilen im Resultset der WHERE-Klausel gesperrt sind, die in der Abfrage angegeben sind. Ihre Abfrage gibt beispielsweise 6 Zeilen aus einer Tabelle zurück. 4 dieser 6 Zeilen sind aufgrund einer anderen Transaktion bereits gesperrt. In diesem Fall können Sie eine SKIP LOCKED-Schlüsselwort (keyword) zusammen mit der FOR UPDATE-Schlüsselwort (keyword) angeben, die die Datenbank anweist, zu versuchen, die in der WHERE-Klausel angegebenen Zeilen zu sperren und alle Zeilen zu überspringen, die bereits gesperrt sind. Die entsperrten Zeilen in der WHERE-Klausel werden während der Transaktion gesperrt, und die Anweisung nach der Abfrage kann alle erforderlichen Updates für sie ausführen, sodass diese Zeilen nicht erneut abgefragt werden. Dadurch wird sichergestellt, dass Sie nicht auf den Empfang der Abrufnachrichten warten müssen, bis alle zeilen, die in der WHERE-Klausel angegeben sind, entsperrt sind.
Die SKIP LOCKED-Schlüsselwort (keyword) ist in einem Szenario nützlich, in dem Adapterclients auf mehreren Computern vorhanden sind, die dieselbe Tabelle in einer Datenbank abrufen. Sie können einen Lastenausgleich zwischen den Adapterclients durchführen, indem Sie den Abrufvorgang so konfigurieren, dass Sie abrufbasierte Datenänderungsmeldungen für die zeilen erhalten, die in der WHERE-Klausel angegeben sind und zu diesem Zeitpunkt entsperrt sind, und dann die Zeile aktualisieren, um sicherzustellen, dass sichergestellt wird, dass, wenn eine abrufbasierte Datenänderungsmeldung von einem Adapterclient empfangen wird, die anderen Clients erhalten nicht dieselbe Nachricht.
Ein Beispiel für eine Abfrage mit der Option SKIP LOCKED ist:
SELECT * from EMP WHERE FLAG = 'Y' FOR UPDATE SKIP LOCKED
Unterstützung für die bestellte Lieferung (FIFO)
In einer Produktionsumgebung kann die Abfrage verwendet werden, um die Datenänderungen in der Oracle-Datenbank zu überwachen. Diese Daten geänderten Nachrichten werden vom Adapterclient mithilfe des Oracle Database-Adapters empfangen. Basierend auf Geschäftsszenarien kann es wichtig sein, dass die datenveränderten Nachrichten vom Adapterclient in der richtigen Reihenfolge empfangen werden.
Der Oracle Database-Adapter unterstützt die geordnete Übermittlung oder fifo (First In First Out), um die Reihenfolge beizubehalten, in der Nachrichten aus der Oracle-Datenbank empfangen werden. Im Folgenden finden Sie einige Überlegungen zur Unterstützung von FIFO in eingehenden Szenarien für den Oracle Database-Adapter.
Wenn die Nachricht von einer Orchestrierung genutzt wird, muss für die Orchestrierung die geordnete Übermittlung für die Nachrichten festgelegt sein, die vom Empfangsport des Oracle Database-Adapters stammen.
Wenn die Nachricht von einem Sendeport (in einem inhaltsbasierten Routing)-Szenario verwendet wird, muss für den Sendeport eine geordnete Übermittlung für die Nachrichten festgelegt sein, die vom Empfangsport des Oracle Database-Adapters stammen.
Der WCF-Custom- oder WCF-OracleDB-Adapter verfügt über die Eigenschaft Anforderungsnachricht bei Fehler anhalten , die angibt, ob die Anforderungsnachricht angehalten werden soll, die bei der eingehenden Verarbeitung fehlschlägt. Diese Eigenschaft kann auf der Registerkarte Nachrichten des WCF-Custom oder WCF-OracleDB Empfangsports im Abschnitt Fehlerbehandlung festgelegt werden. In der folgenden Tabelle sind die Szenarien aufgeführt, in denen beschrieben wird, wie die eingehenden Nachrichten basierend darauf verarbeitet werden, ob diese Eigenschaft festgelegt ist, und dem Status des Nachrichtenabonnenten (Orchestrierung oder Port).
Port (Eigenschaft) | Abonnent im Status "Nicht eingetragen" | Abonnent im Status "Eingetragen", aber "Beendet" |
---|---|---|
Anforderungsmeldung bei Fehlereigenschaft NICHT festgelegt | - Routingfehlerbericht wird als angehaltene (nicht fortsetzbare Nachricht) generiert. – Die tatsächliche Nachricht ist nicht angehalten – Die Abfrage nach der Abfrage wird nicht ausgeführt, wenn die Transaktion abgebrochen wird. Daher wiederholt sich das Abfragen und ruft die Zeilen erneut ab. – Fehler, die im Ereignisprotokoll gemeldet wurden, um zu beschreiben, was passiert ist. |
– Nicht als "Fehler" angesehen. Das Ereignisprotokoll enthält keine Fehlermeldungen. – Die tatsächliche Nachricht wird in die angehaltene (fortsetzbare) Warteschlange eingefügt. – Wenn der abonnierende Port oder die Orchestrierung gestartet wird, werden die Nachrichten automatisch fortgesetzt. Wenn die bestellte Lieferung für den Abonnenten festgelegt ist, wird sie berücksichtigt. - Die Nachrichten können auch manuell fortgesetzt werden. |
Anforderungsmeldung bei Fehlereigenschaft IS festgelegt | - Routingfehlerbericht wird als angehaltene (nicht fortsetzbare Nachricht) generiert. - Die tatsächliche Nachricht wird ebenfalls angehalten. – Die Abfrage nach der Abfrage wird nicht ausgeführt, wenn die Transaktion abgebrochen wird. Daher wiederholt sich das Abfragen und ruft die Zeilen erneut ab. – Fehler, die im Ereignisprotokoll gemeldet wurden, um zu beschreiben, was passiert ist. |
– Nicht als "Fehler" angesehen. Das Ereignisprotokoll enthält keine Fehlermeldungen. – Die tatsächliche Nachricht wird in die angehaltene (fortsetzbare) Warteschlange eingefügt. – Wenn der abonnierende Port oder die Orchestrierung gestartet wird, werden die Nachrichten automatisch fortgesetzt. Wenn die bestellte Lieferung für den Abonnenten festgelegt ist, wird sie berücksichtigt. - Die Nachrichten können auch manuell fortgesetzt werden. |
Weitere Informationen
Entwickeln der Oracle Database-Anwendungen
Abfragen von Oracle Database mithilfe von BizTalk Server
Empfangen von Abrufdaten geänderten Nachrichten in Oracle Database mithilfe des WCF-Dienstmodells
Empfangen von abrufbasierten datenseitig geänderten Nachrichten in Oracle Database mithilfe des WCF-Kanalmodells