Nel riferimento Hibernate, si afferma più volte cheCome interrompere una sessione di sospensione?
Tutte le eccezioni generate dal Hibernate sono fatali. Ciò significa che è necessario ripristinare la transazione del database e chiudere l'attuale
Session
. Non sei autorizzato a continuare con che funziona con unSession
che ha generato un'eccezione.
Una delle nostre applicazioni legacy utilizza una singola sessione per aggiornare/inserire molti record da file in una tabella DB. Ogni aggiornamento/inserimento di record viene eseguito in una transazione separata, che viene quindi confermata (o ripristinata nel caso si verifichi un errore). Quindi per il prossimo record viene aperta una nuova transazione, e così via. Ma la stessa sessione viene utilizzata durante l'intero processo, anche se uno HibernateException
è stato catturato durante l'elaborazione. Stiamo utilizzando Oracle 9i btw con Hibernate 3.24.sp1 su JBoss 4.2.
Leggendo quanto sopra nel libro, ho capito che questo progetto potrebbe fallire. Così ho refactored l'app per utilizzare una sessione separata per ogni aggiornamento del record. In un test unitario con una fabbrica di sessioni di simulazione, posso verificare che ora stia richiedendo una nuova sessione per ogni aggiornamento del record. Fin qui tutto bene.
Tuttavia, non abbiamo trovato alcun modo per riprodurre l'errore di sessione durante il test dell'intera app (sarebbe questo uno stress test btw, o ...?). Abbiamo pensato di arrestare l'ascoltatore del DB, ma ci siamo resi conto che l'app ha mantenuto un certo numero di connessioni aperte al DB e il listener non avrebbe influito su quelle connessioni. (Questa è un'app Web, attivata una volta ogni notte da uno scheduler, ma può anche essere attivata tramite il browser.) Poi abbiamo provato ad eliminare alcune di queste connessioni nel DB mentre l'app stava elaborando gli aggiornamenti - questo ha comportato un errore aggiornamenti, ma poi l'app ha continuato felicemente ad aggiornare il resto dei record. Apparentemente Hibernate è abbastanza intelligente da riaprire connessioni rotte sotto il cofano senza interrompere l'intera sessione.
Quindi questo potrebbe non essere un problema critico, in quanto la nostra app sembra essere abbastanza robusta anche nella sua forma originale. Tuttavia, il problema continua a infastidirmi. Vorrei sapere:
- In quali circostanze la sessione Hibernate davvero diventare inutilizzabile dopo un
HibernateException
è stato gettato (Aggiornamento: e quali sono i sintomi)? - Come riprodurre questo in un test (Aggiornamento: preferibilmente in integrazione, piuttosto che test di unità)?
- (Qual è il termine corretto per una tale prova?)
Per quanto riguarda 1), anche questa è la mia comprensione, quindi sono felice di aver reso la nostra app più solida. Il problema diretto è, come verificare questo in un test indipendente? 2) sembra interessante, in quanto ciò potrebbe essere fatto senza modificare l'app stessa. –