Desidero chiedere quale potrebbe essere la soluzione migliore per l'applicazione multithread Java per garantire che tutti i thread accedano in modo sincrono db. Ad esempio, ogni thread rappresenta una transazione separata, e prima controlla db per il valore e quindi a seconda della risposta deve inserire o aggiornare alcuni campi nel database (nota tra check, insert e commit l'applicazione sta facendo altre elaborazioni). Ma il problema è che un altro thread potrebbe fare la stessa cosa sullo stesso tavolo. Esempio più specifico. Thread T1 avvia la transazione, quindi controlla la tabella ENTITY_TABLE per l'immissione con il codice '111' se trova la data di aggiornamento, se non trova inserisce una nuova voce, quindi esegue la transazione. Ora immagina che il thread T2 faccia esattamente la stessa cosa. Ora ci sono pochi problemi: 1. T1 e T2 controllano db e non trovano nulla ed entrambi inseriscono la stessa voce. 2. T1 controlla db, trova la voce con la vecchia data, ma sul commit T2 ha già aggiornato la voce a una data più recente. 3. Se utilizziamo la cache e sincronizziamo l'accesso alla cache abbiamo un problema: T1 acquisisce i controlli di blocco db e cache se non trovati aggiungono alla cache, rilascia il blocco, commettono. T2 fa lo stesso, trova la voce nella cache andando a commit. Ma la transazione T1 fallisce e viene ripristinata. Ora T2 è in cattive condizioni, perché dovrebbe essere inserito in ENTITY_TABLE ma non lo sa. 4. di più?Accesso al database con più thread Java
Sto lavorando alla creazione di cache personalizzata semplice con sincronizzazione e risoluzione del problema 3. Ma mi interessa forse c'è qualche soluzione più semplice? Qualcuno ha dovuto risolvere un problema simile? Come l'hai fatto?
Grazie per una risposta. La cosa è che l'applicazione deve essere molto performante, potrebbe funzionare su 16 o forse anche 32 thread. E ognuno avvia la transazione, esegue molta elaborazione, quindi acquisisce risultati e inserisce inserti e aggiornamenti in fase di commit, tutto in lotti jdbc (per prestazioni). Quindi la transazione è impegnata. Comunque nella mia situazione il livello serializzabile sarebbe eccessivo soprattutto per 32 thread. Spero di essere in grado di risolvere questo problema con la cache nell'applicazione Java. – nesvarbu