Ich habe ein Netz von mehreren PCs unter Windows (meist Windows 2000 das Problem tritt aber auch auf XP auf) auf denen eine Applikation von uns läuft.
Diese Applikation liest und schreibt Dateien in einem geshartes Netzwerkverzeichnis in dem ca. 150 kleine Dateien liegen (< 10 KByte pro Datei). Server ist wahlweise ein Windows oder Linux-Rechner. Das Problem tritt unabhängig davon auf.
Hierbei wird jede Datei stets exklusiv geöffnet. D.H. Wenn ein PC mit einer Datei arbeitet wird sie so geöffnet, dass während der Dauer des Dateizugriffes die Datei für alle anderen Rechner im Netz gesperrt ist. (Auch Lesezugriffe anderer Rechner werden mit Access denied abgelehnt)
Das Problem ist nun folgendes: Rechner A öffnet die Datei XYZ um mit ihr zu arbeiten. Die Datei XYZ wird dadurch für alle anderen Clients im Netz gesperrt. Das funktioniert soweit wunderbar. Versucht nun aber Rechner B ein open auf die Datei XYZ zu machen so dauert es knapp 2 Sekunden bis man die Fehlermeldung access denied bekommt.
Ist die Datei frei erhält man das Filehandel binnen Millisekunden zurück ...
Im Mittel hat jeder Rechner eine Datei auf. Also sind bei 20 Rechnern ca. 20 Datei gelockt. Nun gibt es dummerweise eine Routine in unserer Applikation die den Inhalt aller Dateien interpretieren muss. Da es so ca. 150 Dateien im Ordner gibt iteriert man alle 150 durch. 130 mal klappt es auf Anhieb aber 20 mal versuche ich halt auf eine Datei zuzugreifen die gerade von einem anderen Terminal bearbeitet wird und jedes mal hängt die Routine knapp 2 Sekunden.
-> Macht in Summe eine Laufzeit von ca. 40 Sekunden :-(
Diese2 Sekunden muss eine Einstellung unter Windows sein ?!? Ich denke mal registry oder so. Ich habe mal gegoogled und was zu oportunistic locking gefunden. Ich weiss aber nicht ob ich damit die Sache in den Griff bekomme bzw. wie ich die Registry ändern muss.
Was ich will ist eigentlich ganz einfach. Jeder Filezugriff sollte exklusiv sein. Wenn die Datei von einem anderen Client 'in use' ist möchte ich möglichst rasch eine Meldung bekommen.
Das Programm was die Dateien lockt ist in C++ mit QT geschrieben. Zugriff auf die Datei erfolgt über Standard sopen.
Ich habe aber auch schon testweise versucht eine von uns gelockte Datei mit einem VB.Net Programm zu öffnen aber auch hier dauert es ca. 2 Sekunden bis die Exception kommt dass die Datei gesperrt ist.
Irgendjemand irgendeine Idee zu einem Workaround ?!?
Danke
Christian
Um auf dieses Thema zu ANTWORTEN bitte erst » hier kostenlos registrieren!!
Ich habe ein Netz von mehreren PCs unter Windows (meist Windows 2000 das Problem tritt aber auch auf XP auf) auf denen eine Applikation von uns läuft.
Diese Applikation liest und schreibt Dateien in einem geshartes Netzwerkverzeichnis in dem ca. 150 kleine Dateien liegen (< 10 KByte pro Datei).
Server ist wahlweise ein Windows oder Linux-Rechner. Das Problem tritt unabhängig davon auf.
Hierbei wird jede Datei stets exklusiv geöffnet. D.H. Wenn ein PC mit einer Datei arbeitet wird sie so geöffnet, dass während der Dauer des Dateizugriffes die Datei für alle anderen Rechner im Netz gesperrt ist.
(Auch Lesezugriffe anderer Rechner werden mit Access denied abgelehnt)
Das Problem ist nun folgendes:
Rechner A öffnet die Datei XYZ um mit ihr zu arbeiten. Die Datei XYZ wird dadurch für alle anderen Clients im Netz gesperrt. Das funktioniert soweit wunderbar.
Versucht nun aber Rechner B ein open auf die Datei XYZ zu machen so dauert es knapp 2 Sekunden bis man die Fehlermeldung access denied bekommt.
Ist die Datei frei erhält man das Filehandel binnen Millisekunden zurück ...
Im Mittel hat jeder Rechner eine Datei auf. Also sind bei 20 Rechnern ca. 20 Datei gelockt.
Nun gibt es dummerweise eine Routine in unserer Applikation die den Inhalt aller Dateien interpretieren muss. Da es so ca. 150 Dateien im Ordner gibt iteriert man alle 150 durch. 130 mal klappt es auf Anhieb aber 20 mal versuche ich halt auf eine Datei zuzugreifen die gerade von einem anderen Terminal bearbeitet wird und jedes mal hängt die Routine knapp 2 Sekunden.
-> Macht in Summe eine Laufzeit von ca. 40 Sekunden :-(
Diese2 Sekunden muss eine Einstellung unter Windows sein ?!? Ich denke mal registry oder so. Ich habe mal gegoogled und was zu oportunistic locking gefunden. Ich weiss aber nicht ob ich damit die Sache in den Griff bekomme bzw. wie ich die Registry ändern muss.
Was ich will ist eigentlich ganz einfach.
Jeder Filezugriff sollte exklusiv sein. Wenn die Datei von einem anderen Client 'in use' ist möchte ich möglichst rasch eine Meldung bekommen.
Das Programm was die Dateien lockt ist in C++ mit QT geschrieben. Zugriff auf die Datei erfolgt über Standard sopen.
Ich habe aber auch schon testweise versucht eine von uns gelockte Datei mit einem VB.Net Programm zu öffnen aber auch hier dauert es ca. 2 Sekunden bis die Exception kommt dass die Datei gesperrt ist.
Irgendjemand irgendeine Idee zu einem Workaround ?!?
Danke
Christian