Domanda

Ho il sistema basato su JBoss e Hibernate. E ho bisogno di elaborare due lunghe operazioni. Le operazioni possono essere probabilmente più lunghe del timeout della transazione. Le sue operazioni persistono in moltissime entità, in due diverse transazioni. E se qualcosa va storto, durante queste operazioni, dovrei ripristinare tutti i cambiamenti delle transazioni.

Qual è il modo migliore per risolverlo?

Penso che il modo migliore sia unire tutte le operazioni in un'unica transazione, ma richiede di impostare il timeout della transazione LOng ed è inaccettabile per il nostro sistema.

La gestione di molte transazioni è migliore in questa situazione. E come posso farlo?

È stato utile?

Soluzione

È possibile utilizzare un server JTA (coordinatore delle transazioni) per eseguire la transazione in più passaggi con le transazioni XA? Questo post ha un po 'di fan- a un paio di quelli open-source che potrebbero funzionare per te.

Transazioni XA ti permettono di fare un mucchio di operazioni più piccole e impegnarti o rollback in un colpo solo. Prova a cercare su Google "transazioni ibernazione xa". Le piattaforme RDBMS più moderne (MySQL 5.x, PostgreSQL, SQL Server, Oracle, DB2, Sybase ecc.) Supportano le transazioni XA.

Altri suggerimenti

L'uso di una transazione è buono, solido e così via. Riprova a convincere il tuo amministratore ;-)


Altrimenti, posso pensare a:

  • utilizzando transazioni più brevi per inserire meno righe, usando un indicatore per indicare "incompleto ". Potrebbe essere in una colonna esistente o in una nuova (forse potrebbe essere in una tabella diversa?).
  • se si verificano rollback delle transazioni, riprovare; se si preferisce interrompere l'intera operazione, è possibile scegliere di eliminare le righe che presentano il simbolo "incompleto" marcatore.
  • quando vengono eseguite tutte le transazioni, puoi aprire un'ultima transazione, solo per contrassegnare tutte le righe come " complete " (es: aggiorna ... dove ... ). Questo dovrebbe essere molto più veloce dell'inserimento completo, quindi la transazione dovrebbe essere abbastanza breve.

Ho dovuto fare qualcosa di simile in JPA (via ibernazione). Ho eseguito l'operazione in N transazioni anziché in 1 grande transazione. Questa operazione veniva eseguita raramente - era un lavoro automatizzato - quindi non c'era nessun utente in attesa su una pagina web per un risultato.

Quanto tempo ci vorrà per la transazione? Quanto tempo ti aspetti che l'utente attenda ?? Con quale frequenza ti aspetti che si verifichi questa operazione. Forse i tuoi requisiti non sono chiari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top