fehler durch exzessive belastungen
Manuel Massoth
- datenbank
Hi,
Undzwar habe ich probleme mit einer text-datenbank, die ich
in einem Bannertausch einsetze. Teilweise generieren
mitglieder bis zu 9.000 lese-/schreibzugriffe pro tag.
jetzt kommt es abundzu vor, dass einige felder formatiert werden..
manchmal auch die ganze datei ansich. Da ich kein 'richtiger' programmierer bin frage ich mich ob das ein grundsätzliches
Problem von Text-Datenbanken ist, oder ob es einfach nur daran liegt, das ich unsauber programmiert habe?
benutze folgende methode:
open (Pmemfile,">filexy.dat");
print Pmemfile ("inhaltxy");
close(Pmemfile);
Gruß
Manuel Massoth
Moin,
Problem von Text-Datenbanken ist, oder ob es einfach nur daran liegt, das ich unsauber programmiert habe?
Das Problem ist, dass verschiedene Prozesse gleichzeitig schreibend auf deine Datei zugreifen. Dh. Es werden von zwei verschiedenen Prozessen gleichzeitig Daten in die Datei geschrieben, was nat. nicht gut laufen kann. Du solltest die Datei locken, wenn du schreibend darauf zugreifst.
Wenn ich deinen Beispielscode richtig interpretiere nutzt du Perl, oder? Deswegen solltest du man "perldoc -f flock" lesen, da steht was du machen musst.
9000 lese/schreibzugriffe sollten absolut kein Problem sein, wenn man es richtig macht.
Grüße Andres Freund
PS: Es ist in der Perl Gemeinde de facto Standard, dass Dateihandles groß geschrieben werden.
Hi,
Undzwar habe ich probleme mit einer text-datenbank,
was ist eine Text-Datenbank? Falls Du eine Datei meinst: Die ist _weit_ davon entfernt, irgendetwas mit einer Datenbank zu tun zu haben.
Teilweise generieren
mitglieder bis zu 9.000 lese-/schreibzugriffe pro tag.
Oh. Ich dachte zunächst, Du meintest Zugriffe pro Sekunde, was bisweilen schon ein kritischer Bereich sein könnte. Wenn diese Menge pro Tag aber Probleme macht, dann hast Du etwas ganz grundlegendes falsch gemacht.
manchmal auch die ganze datei ansich. Da ich kein 'richtiger' programmierer bin frage ich mich ob das ein grundsätzliches
Problem von Text-Datenbanken ist, oder ob es einfach nur daran liegt, das ich unsauber programmiert habe?
Es liegt daran, dass es - wie ich Deinem Codebeispiel entnehme - sich nicht im mindesten um eine Datenbank handelt, sondern Du nur eine Datei beackerst, ohne Dich um die - existierenden - parallelen Zugriffe zu kümmern.
benutze folgende methode:
Ist das Perl?
open (Pmemfile,">filexy.dat");
perldoc perlstyle (Klammern und Namen), Singlequotes statt Doublequotes, wo diese nicht benötigt werden.
print Pmemfile ("inhaltxy");
Wozu dieser Listenkontext?
close(Pmemfile);
Bei _allen_ Öffnungsvorgängen und _allen_ Schließungen zum Schreiben geöffneter Dateien _immer_ den Fehlerfall abfangen. Ferner:
perldoc -f flock
perldoc perlopentut
Cheatah
Halihallo Manuel
manchmal auch die ganze datei ansich. Da ich kein 'richtiger' programmierer bin frage ich mich ob das ein grundsätzliches
Problem von Text-Datenbanken ist, oder ob es einfach nur daran liegt, das ich unsauber programmiert habe?
Naja, ein bisschen von beidem. Du spürst schlicht die Auswirkungen von konkurrierenden
Schreibzugriffen. Falls einmal zwei Page- bzw. Adviews zur selben Zeit generiert werden,
kann es vorkommen, dass die zwei offenen Dateihandles nicht synchonisiert
niedergeschrieben werden und so Daten überschrieben werden.
Es steht nun bei Text-Datenbanken im Interesse des Programmierers, dem Computer die
synchronisation bzw. das Recht zum Schreiben zu vergeben. Dies kannst du über
File-locking (s. perldoc -f flock und *nix manpages) erzwingen.
Etwas einfach ausgedrückt sagst du damit:
So, jetzt will ich (der eine Prozess) schreiben, du sollst warten, bis ich das getan
habe und dann darfst du.
Achte beim Locking jedoch auch darauf, dass du Daten ggf. liest, dann die Datei zum
schreiben öffnest und die geänderten Daten dort hineinschreibst. Wer garantiert dir,
dass während dem Verarbeiten der eingelesenen Daten (also zwischen lesen und schreiben),
die Daten durch einen anderen Prozess schon wieder verändert wurden? - Niemand!
Für Deinen Fall könnte ich mir vorstellen, dass es noch eine weitaus
performanceschonendere Möglichkeit gibt, wenn du Dateien nur zum Schreiben benutzt und
zwar sequenziell (also nur jeweils eine Zeile pro Datensatz anhängen musst, dies
funktioniert IMHO auch ohne flock sicher). Vielleicht ist es möglich, alle komplexeren
Abfragen und Mutationen des Datenbestandes a) auf niederfrequentiertere Zeiten zu
verlegen und b) in einem völlig unabhängigen Prozess zu machen (der jetzt aber wiederum
voll auf flock setzt).
Viele Grüsse
Philipp
Halihallo Manuel
[...]
BTW: Cheatah hat bewusst das Wort "Datenbank" kritisiert. Denn genau Datenbanken sorgen
_selber_ für diese Integrität (einer der Vorteile von DBMS). Bei 9000 Requests/Tag wäre
der Gedanke an eine Datenbank ggf. ratsam (obwohl hier textuelle, auf Flat-file
basierende Lösungen oftmals mehr performanceschonend sind).
Nun, war nur ein Gedanke. Eine Flatfile-Lösung halte ich nicht für minder gut. Im
Gegenteil, aber man muss sich schon etwas dabei überlegen...
Viele Grüsse
Philipp