OVH Cloud OVH Cloud

AspectJ et gestion SQLException

1 réponse
Avatar
pioug
Bonjour,

Je possede une classe de gestion d'acces à une base de donnée
(SqlAccess). L'inconvenient c'est que j'ai des try{ }catch(SqlException
exp){ } de partout j'aimerai utiliser une classe aspect pour centraliser
la gestion des erreurs SQL.

Merci

Exemple Source
http://www-128.ibm.com/developerworks/java/library/j-aspectj/
Listing 8
Ce source n'est pas compilable (Eclipse 3.0.2 et AJDT 1.5.0.2 Last version)
Ci dessous une vue simplifiée avec quelques modifs


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class SqlAccess {

public Connection conn;
public Statement stmt;


public void doUpdate(){
//ERREUR DE COMPIL
conn = DriverManager.getConnection("url for testing purposes");
//ERREUR DE COMPIL
stmt = conn.createStatement();
//ERREUR DE COMPIL
stmt.execute("UPDATE ACCOUNTS SET BALANCE = 0");
//ERREUR DE COMPIL
}

public static void main(String[] args)throws Exception{
new SqlAccess().doUpdate();
}
}


/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////


import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.SQLException;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.aspectj.lang.JoinPoint;

public aspect exceptionHandling {
private static Logger loLog = Logger.getLogger(exceptionHandling.class
.getName());

public static final Level moLevel = Level.ALL;

static {
try {
Handler loHandler = new FileHandler("FicLog.log");
loLog.addHandler(loHandler);
loLog.setLevel(moLevel);
} catch (SecurityException e) {
} catch (IOException e) {
}
}

declare soft : java.sql.SQLException : within(SqlAccess);

pointcut methodCall(SqlAccess accessor) : this(accessor)
&& call(* SqlAccess.*(..));

after(SqlAccess accessor) : methodCall (accessor){
System.out.println("Closing connections.");
if (accessor.stmt != null) {
try {
accessor.stmt.close();
} catch (SQLException e) {
logException(Level.WARNING ,e,thisJoinPoint);
}
}
if (accessor.conn != null) {
try {
accessor.conn.close();
} catch (SQLException e) {
logException(Level.WARNING ,e,thisJoinPoint);
}
}

}

private void logException(Level poLevel, Exception poException,
JoinPoint poJoinPoint) {
String lsNomMethode = poJoinPoint.getSignature().toString();
String lsMess = "";
lsMess += "\n________DEBUT________METHODE " + lsNomMethode
+ "_________________\n";
Object loArgs[] = poJoinPoint.getArgs();
lsMess += loArgs.length + " parametres\n";
for (int lnI = 0; lnI < loArgs.length; lnI++) {
lsMess += loArgs[lnI];
if (loArgs.length > 1) {
lsMess += "\n";
}
}
if (poException != null) {
lsMess += "\n_____________________STACK
TRACE__________________________\n";
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
poException.printStackTrace(pw);
lsMess += sw.toString();
}

lsMess += "\n_______FIN_________METHODE " + lsNomMethode
+ "_________________\n";
loLog.log(poLevel, lsMess);
}
}


Merci

1 réponse

Avatar
erik.koerber
Salut,

Même si cela demande un petit effort au début je ne peux que te
conseiller instamment d'utiliser un framework comme Spring
(http://www.springframework.org) qui s'occupe de beaucoup des "petits"
inconvénients liés à l'utilisation directe de JDBC.

Cela t'évitera beaucoup de désagréments avec les exceptions, les
close etc.

D'autre part il faut savoir que l'utilisation d'AspectJ - même si je
ne la déconseille surement pas - ne facilite pas vraiment la vie (la
compilation devient notablement plus lente, on a parfois de curieux
effets etc.).

Un simple petit conseil...

Erik