26. Juni 2008 15:45
Hallo,
ich habe ein Problem beim Schreiben von XML Daten in BLOB Felder via Streams. Die Schwierigkeiten treten erst ab einer gewissen Groese der einzulesenden XML Datei auf.
Files < ~700KB werden schnell und ohne Probleme eingelesen und gespeichert, sind sie groeser, verlangsamt sich das Programm massiv (~1KB/sec) und bei 770KB verabschiedet er sich mit dem Fehler, dass die DB voll ist,
was natuerlich nicht stimmt.
Das Programm ist so aufgebaut:
Die Daten lese ich aus einer Queue (MQ Series) schrittweise (bei jedem loop 300 Zeichen) aus.
Beim ersten Durchlauf erstelle ich einen Record in der Tabelle "EDI Message" und oeffne einen Stream auf das BLOB Feld "EDI Content".
Jetzt fuegt er laufend Teilstrings hinzu und speichert den Record immer wieder ab.
Ich habe testweise nach jedem Modify ein Commit gesetzt. So bringt er keinen Error am Schluss, wird allerdings noch langsamer.
Dateien mit ~1MB sind eigentlich nicht gross, und wenn man bedenkt, dass ein BLOB Feld ~2GB aufnehmen kann, dann wundert mich das schon etwas.
- Code:
// readqueue()
FOR i := 1 TO ROUND(RecMessage.MessageLength/MsgLen,1,'>') DO BEGIN
IF RecMessage.DataLength >= MsgLen THEN BEGIN // ReadString kann nicht mehr auslesen, als vorhanden ist. Dann wuerde
TextIn := RecMessage.ReadString(MsgLen); // er nichts mehr auslesen! -> DataLength verwenden, nicht MessageLength
writetable(TextIn);
END ELSE BEGIN
TextIn := RecMessage.ReadString(RecMessage.DataLength);
writetable(TextIn);
END;
- Code:
// writetable(Msg)
IF i = 1 THEN BEGIN
MQFunc.MQMsgCreate(EDIMessage,NewCode,'','','XML','IN'); // Record wird erstellt
CLEAR(OutStrm);
EDIMessage.CALCFIELDS("EDI Content");
EDIMessage."EDI Content".CREATEOUTSTREAM(OutStrm); // Stream oeffnen
END;
OutStrm.WRITETEXT(Msg); // Schreibe Msg in BLOB Feld
EDIMessage.MODIFY();
Dieses Problem habe ich in NAV5.00 und NAV3.60 festgestellt.
Testweise habe ich die Daten nur in ein TXT File auf die Platte geschrieben, und das Speichern in Navision auskommentiert, dann ist er in <1sec fertig. Die MQ Automation kann also nicht Schuld sein.
Hat jemand Loesungsvorschlaege oder sonstige Ideen?
Gruesse
feri
Zuletzt geändert von feri am 30. Juni 2008 15:34, insgesamt 1-mal geändert.