Forum: PC-Programmierung Perl ODBC Datenbankupdates am Besten erkennen


von Martin (Gast)


Lesenswert?

Hallo.

Ich lese mit Perl, ODBC, DBI eine Access Datenbank aus (Win32, cygwin). 
Diese wird unregelmässig von anderen Programmen upgedatet/ geschrieben 
(zwischen 2s und 5Min).
Im Moment mache ich ein nicht sehr schönes sleep(5) bevor mein Skript 
wieder läuft. Ab und an verpasse ich dann ein Update und ein Feld wurde 
quasi zweimal neu geschrieben in der Zwischenzeit.
Wie kann ich erkennen dass die Datenbank upgedatet wurde und wie lese 
ich sie am Besten aus ohne sie ständig zu pollen?
Danke.


Martin

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Martin schrieb:
> upgedatet
autsch Man darf gerne von aktualisiert sprechen ;)

Martin schrieb:
> Diese wird unregelmässig von anderen Programmen

Am simpelstem indem du einfach alle Updates über dein Programm laufen 
lässt, dann kriegst du auch immer gleich die aktuellen Daten und die DB 
ist nur dein persistentes Speichermedium.

von Martin (Gast)


Lesenswert?

Hallo Läubi.

Danke erstmal für deine Antwort. Wie soll ich die Updates über mein 
Programm laufen lassen? Ich habe die anderen Programme nicht unter 
meiner Kontrolle. Die schreiben in die AccessDatenbank auf dem Server 
und ich will möglichst elegant und resourcenschonend diese auslesen wenn 
sich etwas geändert hat.



Martin

von Peter II (Gast)


Lesenswert?

es geht nicht per odbc. Es gibt Datenbanken die können events erzeugen 
(Interbase) aber dies geht dann auch nocht über ODBC.

Das mit dem Sleep(5) ist also ok, es sollte eh keine nennenswerte last 
erzeugen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Dann hast du gewissermaßen "Pech".

Leider schreibst du ja nicht wieso du unbedingt jederzeit "aktuell" sein 
musst, ggf. reicht es ja auch einfach die Daten nicht intern zu cachen 
sondern nur bei Bedarf direkt aus der DB zu lesen.

von Martin (Gast)


Lesenswert?

Hallo.

Manchmal werden einzelne Felder halt schneller als sleep(5) 
überschrieben und ich benötige alle Werte die da in der Zwischenzeit 
drin gestanden haben.
Jetzt kann ich halt sleep(1) verwenden aber ich wollte mal wissen ob es 
da was besseres gibt (quasi eine Art Callback wenn die Datenbank 
aktualisiert worden ist und ann wieder die benötigten Felder lesen und 
nicht die ganze Zeit pollen).

Martin

von Peter II (Gast)


Lesenswert?

Martin schrieb:
> Manchmal werden einzelne Felder halt schneller als sleep(5)
> überschrieben und ich benötige alle Werte die da in der Zwischenzeit
> drin gestanden haben.

dann ist dein Datenbank design falsch, wenn du die werte braucht dann 
musst die sie auch in der DB speichern und dann ist es egal wann du sie 
abfragst.

von Konrad S. (maybee)


Lesenswert?

Martin schrieb:
> Jetzt kann ich halt sleep(1) verwenden aber ich wollte mal wissen ob es
> da was besseres gibt (quasi eine Art Callback wenn die Datenbank

"sleep" löst keine Probleme, es verschiebt sie nur.
Der Callback-Gedanke ist schon richtig. Bei Datenbanken gibt es Trigger. 
Damit kannst du erreichen, dass innerhalb der Datenbank ein Stück Code 
bei bestimmten Aktionen (INSERT, UPDATE, DELETE) ausgeführt wird. Du 
legst eine zusätzliche Tabelle an und baust einen Trigger, der dir die 
gewünschten Daten in diese zusätzliche Tabelle schreibt. Diese 
zusätzliche Tabelle kannst du dann auslesen wann es dir passt, ganz ohne 
sleep. Die verarbeiteten Einträge löscht du dann wieder raus. 
Voraussetzung ist allerdings, dass du Zugriff auf das Datenbankschema 
hast.

von Martin (Gast)


Lesenswert?

Hallo.

In der Datenbank kann ich hinzufügen was ich will. Wie geht denn das mit 
den Upodates mit ODBC Perl?


Martin

von Peter II (Gast)


Lesenswert?

Martin schrieb:
> In der Datenbank kann ich hinzufügen was ich will. Wie geht denn das mit
> den Upodates mit ODBC Perl?

es geht nicht um Perl! Ein Trigger läuft innerhalb der DB und führt 
meist SQL-code aus.

Von Perl machst du ganz normale selects.

Du musst dafür sorgen das alle werte die du braucht gespeichert werden, 
ob nun mit Trigger oder ohne ist dir überlassen. Das muss aber 
innerhalbt der DB erfolgen und nicht von Perl aus.

von Konrad S. (maybee)


Lesenswert?

Mit Access-Datenbanken hab ich nichts am Hut, aber das hier sieht als 
EInstieg gut aus:
  http://office.microsoft.com/de-de/access-help/CH006365515.aspx
und dann "Erstellen eines Triggers".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.