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
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.
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
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.
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.
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
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.
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.
Hallo. In der Datenbank kann ich hinzufügen was ich will. Wie geht denn das mit den Upodates mit ODBC Perl? Martin
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.