Tiposveglio
09-05-2007, 17:03
Ciao a tutti,
sto creando un applicativo che espone una serie di funzionalità tramite WS.
Le tecnologie usate sono EJB 3.0 e application server Glassfish.
Il mio applicativo effettua delle operazioni su un DB relazionale Oracle.
Tutte le operazioni che interagiscono direttamente con il DB (lettura/scrittura) sono marcate come una nuova transazione in quanto devono permettermi di proseguire con l'esecuzione della funzionalità poichè devo rispondere a chi mi ha invocato che c'è stato un problema. Se la transazione fosse la stessa mi farebbe il rollback di tutto e quindi il metodo non terminerebbe con una risposta.
Fin qui tutto ok.
Il problema mi si è presentato oggi durante un test:
1) ho cambiato l'utente del DB ed ho dimenticato di dare i grant sulla sequence che mi genera l'id di una delle mie tabelle al nuovo utente (chiaramente è lo stesso utente che il mio applicativo usa nel connection pool)
2) invoco una funzionalità che deve scrivere delle informazioni su la tabella in questione
Chiaramente non riesco a scrivere in quanto mi si presenta la seguente eccezione
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-02289: sequence does not exist
Error Code: 2289
Call:SELECT SQ_TRANS_TRANSID.NEXTVAL FROM DUAL
Ok, ma la logica che uso dovrebbe permettermi di gestirle queste eccezioni se non fosse che la chiamata SELECT SQ_TRANS_TRANSID.NEXTVAL FROM DUAL (quella che va in errore) non la effettuo io tramite codice ma la gestisce l'entitymanager (nel mio caso Glassfish) e quindi mi manda in rollback la funzione che non termina e rimane appesa invalidandomi così tutta la funzionalità (in poche parole non genero la risposta che chi ha invocato il metodo giustamente si aspetta).
Mi sapreste dire come posso fare per gestire quest'eccezione? E' tutto il pomeriggio che ci sbatto la testa ma proprio non riesco a venirne a capo!
Grazie mille per l'aiuto
Se avete bisogno di maggiori info dite pure!!! Il problema non è semplicissimo da descrivere con poche parole!
sto creando un applicativo che espone una serie di funzionalità tramite WS.
Le tecnologie usate sono EJB 3.0 e application server Glassfish.
Il mio applicativo effettua delle operazioni su un DB relazionale Oracle.
Tutte le operazioni che interagiscono direttamente con il DB (lettura/scrittura) sono marcate come una nuova transazione in quanto devono permettermi di proseguire con l'esecuzione della funzionalità poichè devo rispondere a chi mi ha invocato che c'è stato un problema. Se la transazione fosse la stessa mi farebbe il rollback di tutto e quindi il metodo non terminerebbe con una risposta.
Fin qui tutto ok.
Il problema mi si è presentato oggi durante un test:
1) ho cambiato l'utente del DB ed ho dimenticato di dare i grant sulla sequence che mi genera l'id di una delle mie tabelle al nuovo utente (chiaramente è lo stesso utente che il mio applicativo usa nel connection pool)
2) invoco una funzionalità che deve scrivere delle informazioni su la tabella in questione
Chiaramente non riesco a scrivere in quanto mi si presenta la seguente eccezione
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-02289: sequence does not exist
Error Code: 2289
Call:SELECT SQ_TRANS_TRANSID.NEXTVAL FROM DUAL
Ok, ma la logica che uso dovrebbe permettermi di gestirle queste eccezioni se non fosse che la chiamata SELECT SQ_TRANS_TRANSID.NEXTVAL FROM DUAL (quella che va in errore) non la effettuo io tramite codice ma la gestisce l'entitymanager (nel mio caso Glassfish) e quindi mi manda in rollback la funzione che non termina e rimane appesa invalidandomi così tutta la funzionalità (in poche parole non genero la risposta che chi ha invocato il metodo giustamente si aspetta).
Mi sapreste dire come posso fare per gestire quest'eccezione? E' tutto il pomeriggio che ci sbatto la testa ma proprio non riesco a venirne a capo!
Grazie mille per l'aiuto
Se avete bisogno di maggiori info dite pure!!! Il problema non è semplicissimo da descrivere con poche parole!