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; } }
J'ai peut être louper quelque chose depuis la FAQ ...
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; } } }
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)
Partager