LoCal Geschrieben 20. Juli 2005 Geschrieben 20. Juli 2005 Hallo, ich habe hier ein "kleines" Problem. Ich muss Daten in eine Tabelle (Tab1) eintragen, diese Daten müssen aber durch einen fortlaufenden Wert aus einer anderen Tabelle (Tab2) ergänzt werden, diese Tabelle befindet sich aber auch im Zugriff von anderen (RPG-)Programmen. Ablauf ist also wie folgt. - Lese Satz aus Datei - Bereite Daten für Insert in Tab1 auf - Hole laufende Nummer aus Tab2 - Update Tab2 mit laufende Nummer + 1 - Schreibe Daten in Tab 1 Das ganze wird gemacht bis alles Sätze aus der Datei eingestellt sind. Die Anzahl der Sätze schwankt zwischen 5000 und 20000. Nun habe ich das Problem, dass wenn ich die Verbindung für Tab2 offen halte, RPG-Programme auf MSGW laufen, weil die Tabelle gesperrt ist. Also probierte ich es auf die Weise, dass ich erst für den Update für Tab2 die DB-Verbindung aufbaue und dann nach dem Update wieder trenne. Performancemäßig sehr schlecht, aber wenigstens wurde der Betrieb nicht gestört... aber heute stellte sich dann ein zweites, viel grösseres Manko heraus: Die Maschine wird mit Datenbankserverjobs (QZDASOINIT) zu gemüllt. Kennt jemand vll eine Lösung? Danke schonmal. Zitieren
Catweezle Geschrieben 20. Juli 2005 Geschrieben 20. Juli 2005 Mal sehen ob Dir das weiterhilft. 'auslesen anzahl der zu verarbeitenden Sätze' Zähler = 0 Setll auf Datei Reade Datei *in77 doweq *off Zähler = Zähler +1 reade Datei enddo - Hole laufende Nummer aus Tab2 merken in Feld1 schleife// - Lese Satz aus Datei - Bereite Daten für Insert in Tab1 auf mit Wert aus Feld 1 - Feld1 = Feld1 + 1 - Schreibe Daten in Tab 1 Schleife// - Update Tab2 mit Nummer aus Feld1 + Zähler Ich hoffe du kannst mir folgen. Hier nochmal in Worten: Du liest die Anzahl der zu verarbeitenden Sätze aus. Merkst Dir diesen Wert Du liest deinen Zähler aus und schreibst deine Sätze jeweils mit Zähler +1 Dann schreibst du deinen Zähler mit dem nneuen Wert (Zähler alt + Anzahl Sätze) wieder weg. Wenn du Angst hast dass die Zählertab in dieser Zeit von einem anderen Programm hochgesetzt wird dann kannst du diese Schritte auch gleich hintereinander machen -Tab2 auslesen -Tab2 +Anzahl Sätze updaten. Ich hoffe das hilft Zitieren
LoCal Geschrieben 20. Juli 2005 Autor Geschrieben 20. Juli 2005 Hallo, erstmal vielen Dank für die Antwort... aber ich bezog mich auf ein Java-Problem nicht auf ein RPG-Problem :-D Zahl holen, Zahl im Speicher halten und ohne Update weiter arbeiten kann ich leider nicht, da auch andere Programme mit dem Nummernkreis arbeiten. Und da es sich bei dem Feld um einen Schlüssel handelt sind doppelte Nummern zu vermeiden Also workaround ist mir folgende Lösung eingefallen. Ich kenne die Anzahl der Sätze, darum werde ich es einfach so machen: - laufende Nummer von Tab2 holen - laufende Nummer + Anzahl der Sätze + 1 - neue laufende Nummer schreiben Tab2 ist dann für die weitere Verarbeitung realtiv egal und ich habe halt meinen Nummern Pool. Allerdings sind Programmabbrüche nun tunlichst zu vermeiden. Zitieren
Peeter Geschrieben 20. Juli 2005 Geschrieben 20. Juli 2005 Also ich hatte mir für sowas mal eine StoredProcedure geschrieben. Dazu MUSS Tab2 "journalized" sein... Den Code für die StoredProcedure kann ich dir morgen mal posten... Zitieren
ExAzubi Geschrieben 21. Juli 2005 Geschrieben 21. Juli 2005 Hallo ich weiß leider nicht welchen Treiber du für die Connection zur DB2 benutzt (AS400 Java toolkit von IBM vielleicht?), aber du kannst beim Aufbauen der Connection irgendwo (habe leider im Moment keine Doku zur Hand) sagen, wie die Sperrung auf die Tabelle laufen soll. Müsstest du in der Doku zu deinem verwendeten Treiber aber finden. Die QZDASOINIT-Jobs sind ormal, für jeden Connectionaufbau gibt es einen, die sich leider sich nur etwas verzögert wieder beeenden. Zitieren
Peeter Geschrieben 21. Juli 2005 Geschrieben 21. Juli 2005 Also hier wie versprochen den Quellcode der storedProcedure: BEGIN ATOMIC SELECT ( ID + 1 ) INTO O_ID FROM TAB2 WITH CS ; UPDATE TAB1 SET ID = O_ID WITH CS ; END Also der Code macht folgendes (wenn die TAB2 journalisiert ist!): Hol dir die ID aus TAB2 und speichere sie in einer Ausgabevariablen und locke dabei die Tabelle (with CS). Dann aktualisiere TAB1 mit der zwischengespeicherten ID. "O_ID" ist als Ausgabeparameter der StoredProcedure zu sehen. Das wichtigste ist, das "with CS". Damit wird innerhalb einer Transaktion die entsprechende Zeile der Tabelle gelockt... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.