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
    [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
    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
    J'avais un doute à ce niveau.

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