Jump to content

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

Empfohlene Beiträge

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Nimm an der Diskussion teil

Du kannst jetzt hier posten und Dich später registrieren. Wenn Du bereits über eine Konto verfügst, melde Dich jetzt an, um mit Deinem Konto zu posten.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

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

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

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


Fachinformatiker.de, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

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

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung