ODBC-Protokoll
-
Hallo.
Anscheinend protokolliert ODBC die Datenbankzugriffe kurzzeitig im temporären Verzeichnis. Kann mir jemand mitteilen, wie man diese Protokollfunktion abschalten kann ?
[edit]
Öhm, vielleicht hilft es ja noch etwas genauer:Erster Test-Fall:
Wenn ich eine Datenbank über ODBC öffne, wird mir im temporären Verzeichnis des Profiles (Win XP: C:\Dokumente und Einstellungen\ich\Lokale Einstellungen\Temp) eine 0 KB grosse Datei erstellt (Name: CTT + weitere Zeichen + .tmp). Dann schreibe ich eine Menge Daten (die Datei bleibt 0 KB gross). Beim Schliessen der Datenbankverbindung wird die temporäre Datei wieder gelöscht (übrigens nur beim sachgemässen Schliessen. Beim Abwürgen des Programms müllen die Dateien im Laufe der Zeit den Ordner zu).Zweiter Test-Fall:
Ich öffne zwei Tabellen, es werden mir zwei temporäre 0 kb Dateien erstellt. Jetzt lese ich die erste Tabelle aus und schreibe die Werte in die zweite. Nun wächst die eine temporäre Datei ständig an (je nach Datenanzahl auf zig MB). Beim Schliessen der Verbindung werden die erstellten Dateien wieder gelöscht.Mein Problem-Fall:
Ich öffne einen ganzen Haufen Tabellen. Aus mehreren Tabellen werden zusammenhängende neue Daten in das bestehende System eingelesen, Schlüssel werden mit weiteren Schlüsseltabellen gegengeprüft, Primärschlüssel werden mit Produktivtabellen geprüft und ggf. generiert usw. usw.. Und das alles mit hunderttausenden Datensätzen. Fazit: im ungünstigsten Fall protokolliert sich das System zu tode, wenn die Partition voll ist.Nun habe ich gehört, dass diese Protokollfunktion abstellbar ist, habe aber noch nicht gefunden, wie. Wenn also jemand einen Tipp hat, könnte ich den echt gut gebrauchen.
[/edit]
-
Ich denke das wird wohl davon abhängen, womit du arbeitest...
Winapi. mfc oder VCL...Okay könnte auch eine Systemweite einstellung sein.. Aber dann muesstest du ja bei jedem System erstmal was verändern..
-
Mmmmmhhhhh,...
Das Programm ist mit Visual Studio 6.0 in C/C++ geschrieben.
Der Datenbankzugriff erfolgt über die MFC-Klassen CDatabase und CRecordset und zwar auf Oracle- und Access-Datenbanken.
...und wie bereits erwähnt mittels ODBC...
-
Bist du sicher, das das vom ODBC-Treiber kommt und nicht einfach nur das Transaktions-Log deiner Datenbank ist? Ich weiss ja nicht, wie's Access macht, aber SQLite schreibt sein Transaktions-Log auch in's Temp-Verzeichnis.
Ich hab's selber nie benutzt, aber wenn es wirklich der ODBC-Trace ist, solltest du es per SQLSetConnectAttr() aus dem ODBC-API aktivieren/deaktivieren können. Dazu dient das Flag SQL_ATTR_TRACE.
-
Hm. M.E. muss man das Logging aktivieren. Per Default ist dieses deaktiviert. (In den Optionen zu den ODBC-Datenquellen gibt es dafür den Schalter Ablaufverfolgung aktivieren, wenn ich das richtig verstehe)
Für mich sieht das eher nach einem lokalen Datenpuffer auf. Vielleicht das Transaktionsmodell mal überprüfen... (ist aber nur geraten).
-
Vielen Dank schon mal für die Hinweise.
Ich bin nicht sicher, ob es der ODBC-Treiber ist.
Eigentlich habe ich nur mal einen Performance-Test gemacht. Dazu habe ich mir zwei Millionen Testdatensätze generiert und wollte sie durch das System schaufeln. Nach ungefähr der Hälte tat sich gar nix mehr. Da war dann nämlich die C-Partition voll (mit besagten Dateien im besagten Verzeichnis). Ein Kollege meinte dazu nur: Yo, das ist der ODBC-Treiber. Das kann man auch irgendwo abschalten.
Daher meine Vermutung...
Die Ablaufverfolgung vom ODBC-Treiber ist es übrigens nicht, die ist mir bekannt.
Aber das Transaktions-Dingens ist ja von euch noch erwähnt wurden. Da werde ich mal in die Richtung weiter forschen. Und natürlich gucke ich mir auch mal das SQLSetConnectAttr() an.