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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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)