Domanda

Ho del codice a cui voglio consentire l'accesso solo con un thread. So come realizzare questo utilizzando blocchi o metodi sincronizzati , ma funzionerà in un ambiente cluster?

L'ambiente di destinazione è WebSphere 6.0, con 2 nodi nel cluster.

Ho la sensazione che sincronizzato non funzionerà, dal momento che ogni istanza dell'applicazione su ciascun nodo avrà la sua JVM, giusto?

Quello che sto provando a fare qui è eseguire alcuni aggiornamenti ai record del database all'avvio del sistema. Cercherà tutti i record di database più vecchi della versione del codice ed eseguirà attività specifiche per aggiornarli. Voglio solo un nodo per eseguire questi aggiornamenti, poiché voglio essere sicuro che ogni elemento di lavoro venga aggiornato solo una volta, e le prestazioni di questi aggiornamenti non sono una grande preoccupazione, poiché si verificano solo all'avvio dell'applicazione e fanno davvero qualsiasi cosa quando il codice è stato modificato dall'ultima volta in cui è stato avviato.

Il database è DB2v9 e accedo direttamente tramite JNDI (nessun livello ORM).

È stato suggerito che un blocco globale potrebbe essere la strada da percorrere qui, ma non sono sicuro di come farlo.

Qualcuno ha qualche suggerimento in questa arena?

Grazie!

È stato utile?

Soluzione

Hai ragione sul fatto che la sincronizzazione tra processi non funzionerà usando i costrutti di sincronizzazione Java. Fortunatamente, il tuo problema non è in realtà la sincronizzazione del codice, ma piuttosto la sincronizzazione delle interazioni con il database.

Il modo giusto per affrontare questo problema è con i blocchi a livello di database. Presumibilmente hai una tabella che contiene una versione dello schema db, quindi dovresti assicurarti di bloccare quella tabella per la durata del processo di avvio / aggiornamento.

Le esatte chiamate sql / db interessate sarebbero probabilmente più chiare se si specificavano il tipo di database (DB2?) e il metodo di accesso (sql grezzo, jpa, ecc.)

Aggiornamento (4/8/2009 14:39) : suggerisco LOCK TABLE su alcune tabelle che contengono la versione # dello schema. Ciò serializzerà l'accesso a quella tabella impedendo a due istanze di eseguire contemporaneamente il codice di aggiornamento.

Altri suggerimenti

Sì, hai ragione nel dire che i blocchi sincronizzati non funzionano su un cluster. Il motivo è, come hai affermato, che ogni nodo ha la propria JVM.

Esistono tuttavia modi per far funzionare i blocchi sincronizzati in un cluster come se funzionassero in un ambiente a nodo singolo. Il modo più semplice è utilizzare un prodotto come Terracotta , che gestirà il coordinamento dei thread tra diverse JVM in modo che i normali controlli di concorrenza può essere utilizzato in tutto il cluster. Ci sono molti articoli che spiegano come funziona, come Introduzione a OpenTerracotta .

Ci sono altre soluzioni, ovviamente. Dipende principalmente da cosa vuoi veramente ottenere qui. Non userei i blocchi del database per la sincronizzazione se è necessario ridimensionare, come DB non lo fa. Ma ti esorto davvero a trovare una soluzione pronta, perché scherzare con la sincronizzazione dei cluster è un affare disordinato :)

Puoi utilizzare una griglia di dati in memoria come http://www.hazelcast.com/ anche per questo. Questa è una struttura di dati distribuiti che supporta il blocco.

Dato che stai parlando di 2 macchine, non hai nemmeno la memoria condivisa, quindi non c'è nulla da sincronizzare.

Facciamo qualcosa di simile con il nostro database. Ciò si ottiene aggiungendo il controllo delle versioni nella tabella. Questo è ciò che dovresti fare,

  1. Aggiungi una colonna per la versione record / riga.
  2. Passa attraverso la logica per verificare se il record deve essere aggiornato.
  3. Quando aggiorni il record, assicurati che la versione del record in DB sia la stessa di quella che hai.
  4. Esegui il backup della versione ogni volta che scrivi nel database.

Dovresti avere un solo server che aggiorna il database se segui queste regole.

Non potresti semplicemente bloccare la tabella (o l'intero db) per gli aggiornamenti, quindi quando il primo nodo ha ottenuto il blocco tutti gli altri nodi non sarebbero in grado di scrivere. I nodi successivi aspetterebbero e quando il blocco verrà rilasciato il codice verrà aggiornato in modo da non richiedere alcun aggiornamento dei record.

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