Ho avuto una discussione con un collega sulla gestione della concorrenza nei bean di sessione singleton. Da quanto ho capito, dopo aver letto lo Oracle documentation, se si omette l'annotazione @ConcurrencyManagement
, il valore predefinito è la concorrenza gestita dal contenitore. Nella documentazione si afferma quanto segue riguardo container gestiti Singleton session bean:Gestione accesso simultaneo in un bean sessione Singleton
L'annotazione javax.ejb.Lock e un tipo javax.ejb.LockType vengono utilizzati per specificare il livello di accesso dei metodi di business del singolo o @ Metodi di timeout.
e
Se non l'annotazione @Lock è presente sulla classe Singleton, il tipo di blocco di default, @Lock (LockType.WRITE), si applica a tutti i metodi di lavoro e di timeout.
Ora, se si annota il fagiolo con @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
, allora si sono tenuti a garantire che lo stato del fagiolo è sincronizzato su tutti i client che utilizzano la parola synchronized
e altre caratteristiche standard Java concorrenza. L'articolo dice anche:
sviluppatori che creano single con la concorrenza di fagioli gestiti sono ammessi utilizzare le primitive di sincronizzazione linguaggio di programmazione Java, come ad esempio la sincronizzazione e volatile, per evitare errori durante l'accesso simultaneo.
non ho visto questo in qualsiasi parte del capitolo sulla concorrenza gestito dal contenitore, mi porta a credere che, se si desidera sincronizzare le cose da soli, è necessario annotare la classe con @ConcurrencyManagement(ConcurrencyManagementType.BEAN)
.
Il mio collega ha fatto un commento dicendo che "voi ragazzi fate qualcosa di strano" quando ha visto questa annotazione sul mio bean, che ha dato inizio a questa discussione.
Nessuno dei suoi bean ha alcuna annotazione @ConcurrencyManagement
, ma utilizza la parola chiave synchronized
in tutta la classe. Ho ragione nel dire che qualsiasi sincronizzazione a grana più fine che sta usando è inutile, perché tutti i suoi metodi di business hanno un'annotazione implicita @Lock(LockType.WRITE)
? Ciò significherebbe che se un client chiama uno dei suoi metodi, nessun altro client può chiamare alcun metodo del bean, quindi la sincronizzazione esplicita all'interno del metodo sarebbe inutile.
Ad esempio, per alcuni blocchi myLock
utilizzati in synchronized (myLock)
all'interno di uno dei suoi metodi commerciali, non ci sarebbe alcuna contesa per quel blocco poiché i metodi sono effettivamente sincronizzati.
mi corregga se sbaglio, ma sembra che i suoi metodi sostanzialmente simile a questa:
public synchronized void myMethod() {
// do stuff
synchronized (lock) {
// modify mutable state
}
}
public synchronized void myOtherMethod() {
// do other stuff
synchronized (lock) {
// modify mutable state
}
}
Supponendo che lock
è creato in questa session bean Singleton solo per proteggere stato mutevole all'interno del chicco, si sembra che non sia utile quando si utilizza la concorrenza gestita dal contenitore.
Grazie in anticipo per qualsiasi comprensione di questo!
Non credo che questo esista sul nostro progetto. Continuava a dire: "Lo sto facendo da anni, e funziona bene", ma non sembrava che capisse quello che stavo dicendo. Funzionerebbe bene, ma supponendo che quello che sto leggendo sia corretto, i suoi blocchi 'sincronizzati 'sarebbero semplicemente superflui e non migliorerebbero il throughput. –
Sono anche molto tentato di testare il suo codice e vedere se la sua sincronizzazione sta effettivamente facendo qualcosa, ma ho troppo da fare ... forse quando avrò del tempo libero :) –