Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Inscrit en
    février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 15
    Points : 12
    Points
    12
    Par défaut [AspectJ] Récupérer le temps d'exécution d'un java.sql.Statement.executeQuery (JDBC)
    Bonjour à vous,

    Après pas mal de recherche, je suis un peu coincé sur une fonction me permettant de récupérer le temps d'une requête SQL via JDBC.

    Voici mon code actuel :
    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
     
    private static HashMap<String, Long> resultSQL = new HashMap<String, Long>();
     
    pointcut getSQL(String sql) : call(public * java.sql.Statement.executeQuery(String)) && args(sql);
     
    	before(String sql) : getSQL(sql) {
    	    if(debug) {
    	    	resultSQL.put(sql, System.currentTimeMillis());
     
    	    }
    	}
     
    	after(String sql) : getSQL(sql) {
    	    if(debug) {
    	    	DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    	    	Date date = new Date();
    	    	long debut = resultSQL.get(sql);
    	    	long fin = System.currentTimeMillis();
    	    	System.err.println("CORE : [" + dateFormat.format(date) + "] " +  Thread.currentThread().getStackTrace()[2].toString() + " : " + (fin-debut) + " ms : " + sql);
    	    	resultSQL.remove(sql);
    	    }
    	}
    Actuellement, je passe par un HashMap pour connaitre le temps avant la requête que je peux récupérer dans mon "after" et ainsi connaitre le temps d'exécution qui comprend le temps de executeQuery + la récupération du temps de départ dans mon HashMap.

    Je pense qu'il y a moyen de réaliser l'opération autrement, et j'ai trouvé mais il me met une erreur :
    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
    pointcut resultSet(String sql) : execution(public java.sql.ResultSet java.sql.Statement.executeQuery(String)) && args(sql);
     
    	Object around(String sql) : resultSet(sql) {
     
    		long debut = System.currentTimeMillis();
     
    		Object ret = proceed(sql);
     
    		long fin = System.currentTimeMillis();
    		if(debug) {
    			DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    			Date date = new Date();
     
    			System.err.println("CORE : [" + dateFormat.format(date) + "] " +  Thread.currentThread().getStackTrace()[1].toString() + " : " + (fin-debut) + " ms");
    		}
    		return ret;
    	}
    À la ligne où est définit mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object around(String sql) : resultSet(sql) {
    j'obtiens ce message (avertissement)
    advice defined in net.gamsys.utils.LogAspectCore has not been applied [Xlint:adviceDidNotMatch]
    Du coup, je ne récupère aucun message.

    Avez-vous une idée?
    Si il manque des informations, n'hésitez pas à demander

    Merci à vous.

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 652
    Points : 3 730
    Points
    3 730
    Par défaut
    Le compilateur aspectj ne trouve évidemment pas le code source de java.sql.Statement.executeQuery dans les sources de votre code...

    A moins de configurer votre projet pour qu'AspectJ "tisse" le JAR contenant "java.sql.Statement.executeQuery" pour en produire une version instrumentée,...
    et que votre projet utilise cette nouvelle version plutôt que l'originale...

    Ou solution "bête et méchante" : vous écrivez une fonction qui englobe (un wrapper) java.sql.Statement.executeQuery dans un de vos modules et vous utilisez cette fonction dans le pointcut, et comme elle est dans votre code source elle sera instrumentée.

  3. #3
    Membre à l'essai
    Inscrit en
    février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    J'avais un doute à ce niveau.

    Merci pour ta réponse, j'vais rester avec la première solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le temps d'exécution d'un job
    Par lylau dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 22/05/2009, 16h23
  2. Réponses: 1
    Dernier message: 29/05/2008, 19h15
  3. il n'exécute pas un java.sql.PreparedStatement
    Par M.a.n.u. dans le forum JDBC
    Réponses: 1
    Dernier message: 29/04/2008, 09h11
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo