Ecco un sacco di domande :) Proverò a completare le risposte precedenti.
Is there a better way to simulate the DB failure?
test tutti i casi è complicato. Un modo per testare i casi principali sarebbe quello di creare un connettore JCA (un driver DB è è un connettore JCA). È possibile ottenere connessioni dal connettore che verrà inserito nella transazione (un terzo partecipante). La connessione può quindi sollevare determinati errori.
Ci sono tre parti che lavorano insieme: (1) l'applicazione, (2) l'applicazione. gestore delle transazioni del server e (3) il connettore jca (cosiddetto adattatore risorse).

collegamento stesso ganci nella transazione via ManagedConnection.getXAResource
. Con un connettore JCA personalizzato è possibile quindi sollevare eccezione all'applicazione (Connection
nel picutre) o gestore delle transazioni del server di applicazione (XAResource
ottenuti tramite la ManagedConnection
nell'immagine). È possibile eccezione in particolare tiro durante XAResource.prepare
e XAResource.commit
, che corrisponde a errori durante la fase 2 commesso.
Nota che è difficile per controllare l'ordine di enlisment dei partecipanti (vedi this question). Quindi è facile provare che uno dei prepare
fallisce (vale a dire il tuo), ma è difficile controllare l'ordine in cui vengono chiamati. La riproduzione di tutti gli stati non validi di commit a 2 fasi è complicata, specialmente quando si utilizza l'ottimizzazione.
(ho scritto una volta un connettore JCA (http://code.google.com/p/txfs) e ci sono altri intorno, se si desidera che il codice di esempio.)
What happens to the connection object when DB connection goes bad?
Does it retain its value or does it become null?
Il ManagedConnection
può notificare al gestore delle transazioni. Una delle notifiche è ConnectionEvent.CONNECTION_ERROR_OCCURRED
che informa che si è verificato un errore durante l'utilizzo di questa particolare connessione.
Come osservato in altra risposta, v'è normalmente una connessione gestita associato per ogni transazione. La connessione gestita astrae la connessione fisica e non si desidera utilizzarne troppe. L'applicazione ottiene solo "maniglie" (Connection
nella figura). Le maniglie ottenute all'interno di una determinata transazione puntano tutte alla stessa connessione gestita. Questa è un'ottimizzazione supportata dalla maggior parte dei server delle app.
Se la connessione gestita diventare non valida, le maniglie che lo utilizzano non sono più validi pure. Ma le maniglie non possono essere "rinfrescate" da AFAIK. La transazione deve essere ripristinata, la connessione gestita viene distrutta. All'avvio di un'altra transazione, questa verrà associata a un'altra connessione gestita valida dal pool.
What actually happens when application tries to reconnect to DB?
What value does connection object get?
Does it use an existing value from the connection pool?
L'application server gestisce un pool di connessione gestita. Come detto nel paragrafo precedente, si potrebbe andare male mentre viene usato. Ma si può anche andare male senza essere usati. Ad esempio, una connessione gestita utilizzata nel pool potrebbe diventare non valida perché la connessione fisica sottostante è scaduta. I server di app hanno solitamente una funzione per verificare se una connessione gestita è valida, prima che inizi a utilizzarla.In caso contrario, tenterà un'altra connessione gestita dal pool o ne creerà una nuova.
Stai mirando a un particolare database, o questa deve essere una soluzione generalizzata per qualsiasi database collegato a JDBC? – kgrittn
sto usando DB2 e DB2 z/OS adesso. – Andy
Andy, quale metodo per simulare l'errore del database hai scelto? – dmiandre