2009-08-07 6 views
3

Der folgende Trigger verzögert die Einfügeantwort. Wie kann ich das verhindern?Oracle: Wie führe ich einen Insert-Trigger aus, ohne die Insert-Response zu verzögern?

create or replace 
TRIGGER GETHTTPONINSERT 
BEFORE INSERT ON TABLENAME 
FOR EACH ROW 
Declare 
    -- 
BEGIN 
    -- The inserted data is transfered via HTTP to a remote location 
END; 

EDIT Leute sagen mir, Batch-Jobs zu tun, aber ich würde lieber die Daten früher haben 100% Konsistenz als mit. Der Vorteil des Triggers ist, dass er eintritt, sobald die Daten ankommen, aber ich kann mir die Verzögerung der Einfügung nicht leisten.

+0

Sie sollten sich bewusst sein, dass diese Übertragung entweder synchron ist, also muss das System warten, bis die Übertragung abgeschlossen ist, oder asynchron, was bedeutet, dass die Remote-Position regelmäßig nicht mehr synchron ist. Du kannst es nicht auf beide Arten haben. –

+0

würde ich mit einem Asynchron-Option zufrieden sein, auch wenn ich verlieren einige Konsistenz –

+0

ich die asynchrone HTTP-Anforderung versucht, aber die reponse Zeit immer noch die gleichen –

Antwort

4

Es gibt eine perfekte Lösung für diese genaue Situation namens Datenbankänderungsbenachrichtigung.

Sie können es fast genau wie einen asynchronen Auslöser denken.

Sie verwenden das DBMS_Change_Notification Paket Orakel zu erzählen, die Tabellen zu sehen und was zu tun ist, wenn eine Änderung auftritt. Sie können für DML und DDL überwachen, Sie können veranlassen, dass Oracle die Änderungen stapelweise vornimmt (d. H. Warten Sie, bis vor der Ausführung 10 Änderungen vorgenommen werden). Es wird einen Sproc mit einem Objekt aufrufen, das alle Zeilennummern der geänderten Zeilen enthält ... Sie können entscheiden, wie Sie damit umgehen sollen, einschließlich des Aufrufs von HTTP. Es muss nicht fertig sein, damit der Einsatz ausgeführt werden kann. Documentation for 10gR2

+0

Danke! Ich habe es nach deinem Kommentar auf meinem Blog gesehen –

0

na klar, Sie könnten die Verzögerung verhindern, indem Sie den Trigger entfernen .... Sonst wird der Trigger IMMER vor Ihrer Einfügung ausgeführt, dafür ist der TRIGGER BEFORE INSERT gemacht.

Oder vielleicht könnten Sie uns mehr Details darüber geben, was Sie genau brauchen?

+0

und wenn der Auslöser in AFTER geändert wurde, einfügen? Würde es mein Problem lösen? Ich brauche alle Daten zu übertragen, die in meinem Tisch zu einer entfernten Stelle eingefügt wird, die –

+0

Well eine HTTP-Schnittstelle hat, da die HTTP-Sache würde, nachdem der Einsatz ausgelöst werden, der Einsatz wird nicht mehr von der HTTP-Anforderung verzögert werden. So könnte es einen Versuch wert sein. – guigui42

+0

seltsamerweise hat es nicht funktioniert –

10

Ein Ansatz ist der Auslöser erstellen dbms_job zu haben, der einmal ausgeführt wird (jeweils) Zeit, um die http Übertragung auszuführen. Die Erstellung von dbms_jobs ist relativ schnell und Sie können sich vorstellen, dass dies effektiv einen neuen Thread parallel erzeugt.

Siehe http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7267435205059 für weitere Informationen - seinem Beispiel befasst sich mit E-Mail zu senden, aber die Idee ist die gleiche.

+0

Der Trigger hat einen Vorteil der früheren Ausführung, was für mich wichtig ist. –

+0

Wenn Sie genügend job_queue_processes zur Verfügung haben, wird der Job ohne signifikante Verzögerung aufgenommen - das Erstellen des Jobs vom Trigger nimmt jedoch an der Gesamttransaktion teil, so dass die Erstellung des Jobs bis zum Commit verzögert wird (aber dies ist meistens a Gute Sache, da ein Rollback wird nicht den Job erstellen/die Übertragung initiieren) – dpbradley

+0

wird es tun, werde ich versuchen, danke –

3

Vielleicht könnten Sie eine lokale Tabelle erstellen, speichern die Informationen tun Sie übertragen müssen, und erstellen Sie einen Job, der alle X Minuten ausführt. Der Job liest aus der Tabelle, überträgt alle Daten und löscht die übertragenen Daten aus der Tabelle.

1

Ist es nicht möglich, die Replikationsoptionen von Oracle zu verwenden? Sie senden Ihre eingefügten Daten über http an einen Remote-Standort in einem After- oder Before-Statement-Trigger. Was passiert bei einem Rollback? Ihre hhpp-send-Nachricht wird nicht zurückgesetzt, so dass Sie inkonsistente Daten haben.

+0

Inkonsistente Daten sind in meinem Szenario kein Problem –

+0

Welche Art von Kommunikation Oracle Replikation erfordert? Wird es über das Internet funktionieren oder erfordert es ein VPN? –

+0

Sie können Oracle Streams verwenden, um zwei oder mehr Datenbanken zu synchronisieren, die geographisch getrennt sind. Das Internet wird verwendet. – tuinstoel

Verwandte Themen