Impossible de faire un Rollback à partir d'un Savepoint
Bonjour à tous,
J'ai une méthode qui doit faire des INSERT dans une base de données à partir d'un fichier (chaque ligne du fichier représentant un INSERT).
Dès qu'elle rencontre une erreur (Ligne fichier mal formé, par exemple) elle annule tous les INSERT faits.
Je me suis naturellement tourné vers la FAQ : http://java.developpez.com/faq/jdbc/...ons#savepoints
J'ai donc deux classes (Un DAO et une qui execute le traitement avant l'utilisation des méthodes du DAO )
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public class DBBDao{
private Statement statement = null;
private Connection connect = null;
public DBBDao(){
Class.forName("oracle.jdbc.driver.OracleDriver");
. . .
connect = DriverManager.getConnection(URL,LOGIN,PWD);
}
public executeRequest(String request){
. . . //Execute une requete à partir d'un Statement récupéré sur l'objet Connection
}
// Permet de récupérer un Savepoint
public Savepoint getSavePoint(String string) {
if(connect != null)
{
try {
return connect.setSavepoint(string);
} catch (SQLException sqle) {
log.error("Une erreur s'est produite lors de la sauvegarde d'un point avant rollback.",sqle);
}
}
return null;
}
// Permet de faire un rollback depuis un Savepoint passé en paramètre
public boolean executeRollback(Savepoint savepoint){
if(connect != null)
{
try {
connect.rollback(savepoint);
connect.commit();
return true;
} catch (Exception e) {
log.warn("Impossible de faire un rollback !",e);
}
}
return false;
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class DataImport{
private Savepoint save;
public DataImport(){
DBBDao dbm = new DBBDao();
save = dbm.getSavePoint("savepoint" + new SimpleDateFormat("yyyyDDMM_hhmmss").format(new Date()).toString());
Boolean passedVerif = false;
// Mes traitements
. . .
// Vérification sur mes traitements
if(passedVerif){
dbm.executeRequest("INSERT XXX INTO YYY");
}else{
dbm.executeRollback(save);
return;
}
}
} |
J'ai peut être louper quelque chose depuis la FAQ ...
Voici le printstack obtenu :
Les classes sont contenues dans un AAR (fichier Axis 2 ARchive), elles mêmes déployées dans un Tomcat.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
java.sql.SQLException: ORA-01086: le savepoint 'SAVEPOINT20091501_015740' n'a jamais été établi
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:957)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1623)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1588)
at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:3132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194)
at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:133)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595) |