Ho un processo COBOL CICS in esecuzione su un sistema legacy mainframe. Il processo esegue oltre 2K DML in un ambiente DB altamente concorrente. Dopo ogni operazione CRUD, il risultato viene utilizzato per eseguire ulteriori calcoli seguiti di nuovo dalle operazioni CRUD. L'intero processo viene eseguito sotto un blocco di transazione in modo tale che qualsiasi errore prima del completamento con esito positivo comporti il rollback dell'intero set di modifiche del DB, solo in caso di esito positivo di ogni fase del processo fino alla fine, esiste un commit. Il programma COBOL è scritto in modo da non consumare più di 20 secondi dispari per il suo completamento o guasto, nel caso che l'altro processo muoia di fame per la risorsa DB (serrature, bancarelle, ecc.) A causa dell'enormità di questa transazione.
Ora ci viene commissionato di esporre questa applicazione legacy come servizio web Java SOAP. I tre approcci che ho sono:
-
Il livello di servizio del mio codice Java invia un messaggio alla coda con parametri di input, il programma COBOL già esistente preleva il messaggio dalla coda e fa la transazione. Il livello Java esegue il ping della coda in modo asincrono e quando ha ottenuto un risultato dal processo COBOL, lo rimanda al Controller.
-
Scrivi una stored procedure che imita il lavoro eseguito dal processo COBOL inclusa la transazione del DB e chiama tale SP dal livello del servizio Java.
-
Scrivi la logica di business all'interno del livello Java Service / DAO e le transazioni all'interno di un blocco di transazione Spring.
L'azienda non vuole l'approccio numero 1 in quanto significa dipendenza dal programma COBOL legacy. Ho due dubbi qui:
-
Ho capito che gli SP sono migliori dal punto di vista delle prestazioni. Ma l'SP sarà in grado di gestire 2K o più DML dispari all'interno di un blocco di transazione e fare il lavoro in tempo almeno equivalente al tempo impiegato dal processo COBOL? Se sì, allora sarà abbastanza efficiente nel bloccare il rilascio di risorse DB poiché il DB è altamente concorrente e non voglio che altri processi muoiano di fame a causa di esso.
-
Non ho mai eseguito una transazione DB di questa portata dal codice Java e dubito che il blocco di transazione Spring possa contenere efficacemente DML 2K in un singolo blocco. Anche se lo fosse, sono sicuro che non corrisponderebbe alla velocità di COBOL o SP, quindi potrebbe acquisire blocchi su record ecc. E morire di fame altri processi che devono accedere allo stesso per molto tempo.
Le transazioni non si trovano su una particolare tabella DB, è distribuita su 20 diverse tabelle dispari contenenti dati finanziari critici. Stavo pensando di interrompere il gran numero di operazioni CRUD in blocchi di blocchi di Spring, ma sarebbe stato un compito enorme codificare l'intera logica di rollback in Java, ma va bene, la mia preoccupazione principale è bloccare altri processi da DB accesso nel frattempo.
Sono uno sviluppatore Java con scarsa conoscenza di RDBMS e praticamente nessuna conoscenza di COBOL. Sarei grato se qualcuno potesse aiutarmi a indicare la direzione giusta in modo che io possa uscire da solo con una soluzione.