Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird Trigger asynchron ausführen (https://www.delphipraxis.net/172538-firebird-trigger-asynchron-ausfuehren.html)

Morphie 9. Jan 2013 16:22

Datenbank: Firebird • Version: 2.5 • Zugriff über: egal

Firebird Trigger asynchron ausführen
 
Hi,

gibt es in Firebird eigentlich eine Möglichkeit, einen Trigger, bzw. eine Procedure asynchron auszuführen?

Ich habe mir eine Volltextsuche mit diversen Procedures und Triggern programmiert.
Beim Insert oder Update wird die Volltextsuche für einen bestimmten Datensatz erneuert, beim Delete wird die Volltextsuche für den bestimmten Datensatz gelöscht. Funktioniert soweit super.

Jetzt ist es aber so, dass die Indizierung erst fertiggestellt werden muss, bevor ein Insert / Update / Delete fertig ausgeführt ist. Die Zugriffskomponenten warten da natürlich drauf und verlangsamen so das Programm.

Im Normalfall dauert die Indizierung zwar nur so kurz, dass ich den Performanceverlust nicht spüre, aber bei Batchimports oder ähnliches, merkt man es dann schon.

Toll wäre also eine Möglichkeit, um dem Trigger (der die Procedure aufruft) oder der Procedure selbst zu sagen, dass die Indizierung ruhig in einen 2. Thread ausgelagert werden kann, und die Indizierung nicht in "Echtzeit" ausgeführt werden muss...

Gibt es so etwas?
Auch würde mich interessieren, ob es sonst Datenbanken gibt, die so etwas können...

tsteinmaurer 9. Jan 2013 16:30

AW: Firebird Trigger asynchron ausführen
 
Das geht nicht. Was du machen könntest ist den kompletten Trigger Body in ein IF zu packen und dort z.B. auf den CURRENT_USER abfragen. Ein Batch-Import könnte sich dann mit einem Benutzer verbinden, wo er dann in den IF Zweig nicht reinkommt und im Zuge des Batch-Import am Ende einmal die SP aufgerufen wird.

Furtbichler 9. Jan 2013 21:32

AW: Firebird Trigger asynchron ausführen
 
Aktuelle VT-Techniken aktualisieren die VT-Indexe im Hintergrund und periodisch. Nach meinem bescheidenen Kenntnisstand gibt es keine real-time VT-engines, eben genau wegen dem beschriebenen Problem.

Was Du machen könntest, ist in Triggern die Änderungen zu protokollieren und dann periodisch einen VT-Update mit den protokollierten Änderungen durchzuführen.

mkinzler 9. Jan 2013 21:43

AW: Firebird Trigger asynchron ausführen
 
Vielleicht würde es auch reichen, die Trigger für den Batchvorgang zu deaktivieren.

Morphie 10. Jan 2013 09:16

AW: Firebird Trigger asynchron ausführen
 
Danke erst mal für eure Antworten

Also die Trigger zu deaktivieren / zu umgehen macht für mich wenig Sinn, da die Indizierungsdauer dann einfach nur nach hinten verschoben wird. Macht unterm Strich also keinen Unterschied...

Dann werde ich wohl mit der Performancenachteil leben müssen... Hat dann auch den Vorteil, dass ich wirklich immer eine aktuellen Volltextindex habe. :-)

mjustin 10. Jan 2013 11:04

AW: Firebird Trigger asynchron ausführen
 
Zitat:

Zitat von Morphie (Beitrag 1198398)
Ich habe mir eine Volltextsuche mit diversen Procedures und Triggern programmiert.

Auch würde mich interessieren, ob es sonst Datenbanken gibt, die so etwas können...

Ja, es gibt eine Firebird Version mit integrierter Volltextsuche. Diese wird wenn ich mich richtig erinnere mit Apache Lucene realisiert, eine der bekanntesten (wenn nicht die bekannteste überhaupt) Volltext-Engines die es gibt (Open Source). Linnk poste ich eventuell später.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz