Domanda

Sto lavorando su un Java EE 5 applicazione in esecuzione su Websphere 7.0, e sto cercando di trovare un modo thread-safe e performante al multi-thread la persistenza di record di log di controllo del database. Ci sono metodi noti per l'esecuzione di registrazione di controllo multi-threaded modo sicuro ed efficiente all'interno di un'applicazione Java EE?

Se avete bisogno di alcune informazioni di base: l'applicazione è un servizio web, e ogni messaggio di richiesta che riceve i risultati nella creazione di 100 o 200 messaggi del registro di controllo che devono essere persistenti in un database. Originariamente la registrazione di controllo è stato fatto con una classe del gestore di controllo personalizzato che si estende java.util.logging.Handler, e il metodo di pubblicare avrebbe aperto una connessione al database, popolano una dichiarazione preparata dal LogRecord, ed eseguire l'inserto. Dal momento che questa usanza Handler era in esecuzione nel filo del bean, la registrazione di controllo potrebbe aggiungere fino a diversi secondi per il tempo di risposta per ogni messaggio di richiesta ed è stata causando SLA da non perdere.

Quindi, il gestore di controllo è stato sostituito con un gestore wrapper che aggiunge crea un thread separato ( sì, con new Thread (), contro le regole del Java EE ). Il gestore involucro utilizza un vettore di coda i record di controllo, e li persiste il più velocemente possibile nel thread separato con il gestore di controllo.

Anche se rispetta le regole del threading Java EE, questo wrapper ha funzionato abbastanza bene ... fino a quando abbiamo permesso invocazioni concorrenti sul MDB. L'involucro ha il potenziale per rovinare quando più invocazioni EJB sono ammessi, e potenzialmente salverà ogni record di log al database più volte. Questo sembra indicare che la logica involucro o thread di creazione ha un bug.

I stava andando al lavoro per individuare e fissare quel problema, ma ho pensato di chiedere prima quindi se c'è un modo migliore.

È stato utile?

Soluzione

Utilizzando JMS, ha messo quei messaggi di controllo su una coda, e quindi richiamare qualche altro servizio che li prenderà e memorizzarli nel database. Questo, naturalmente, significa che tutti i registri non saranno necessariamente essere memorizzati nel database in tempo reale, ma questo approccio scaricare un po 'di lavoro da Websphere e non avrà di serie Multi threading rottura nel codice.

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