Zum Inhalt springen

[AS400;iSeries;DB2 / JDBC] Locking/Performance Problem


Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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...

Geschrieben

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.

Geschrieben

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...

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...