[Hibernate] Lässt sich die Dauer eines SELECTs loggen?

X5-599

Top Contributor
hallo,

Ich wüsste gerne, ob (und wenn ja: wie) es moglich ist die benötigte Zeit eines SELECT's mit zu loggen. Beim normalen hibernate.show_sql wird ja lediglich der generierte SQL Befehl ausgegeben. Nun hätte ich aber gerne noch sowas wie: Dauer: 32ms, oder so ähnlich.

Gruß
 
verwende z.B. Wrapper-Methoden wie ich eine habe:
Java:
    /**
     * Zentrale Methode für Datenbankanfragen. Nützlich, um etwa Anfragen und deren Dauer
     * zu zählen, den Ort des Aufrufs zu bestimmen und ähnliches.
     * 
     * Führt query.list() aus.
     * 
     * @param <T>
     * @param query
     * @param debug
     *            Debugausgabe ausschalten
     * @return die Ergebnisliste
     */
    @SuppressWarnings("unchecked")
    public static <T>List<T> getList(Query query, boolean debug)  {
        if (!debug || !logger.isDebugEnabled())    {
            return query.list();
        }
        long time = System.currentTimeMillis();

        List list = null;
        try  {
            list = query.list();
        }  catch (RuntimeException e)  {
            logger.debug("Exception for Query: " + formatHQL(query.getQueryString()));
            logger.debug(Helper.getExceptionInfo(e));
            throw e;
        }
        logger.debug("list   : " + Helper.formatLong(list.size(), 7) + ", " + Helper.formatSystemTime(time)
                     + Helper.getFilteredFirstCaller());
        return list;
    }

    /**
     * Gibt die formatierte Differenz aus der aktuellen Systemzeit und der übergebenen Zeit.
     * 
     * @param oldTime
     * @return String
     */
    public static String formatSystemTime(long oldTime) {
        return formatLong(System.currentTimeMillis() - oldTime, 6);
    }
gibt zu allen Anfragen den Aufrufer, die Zeit, die Anzahl Ergebnisse aus, gibt die Query bei Fehler aus usw., nette Hilfe,
muss man allerdings in jeder Query auch aufrufen

günstiger Nebeneffekt und für sich fast schon ein Grund für Extra-Methode ist der generische Cast ohne Warnung:
[c]List<Xy> l = getList(query);[/c]
 
Zuletzt bearbeitet von einem Moderator:
ok, sieht ganz interessant aus:

Aber was hat das <T>List<T> für eine Bedeutung?
in:
Java:
 public static <T>List<T> getList(Query query, boolean debug)

public static List<T> ... wär mir klar. So bekomme ich jeweils die Hibernate Mapped Klasse (z.B. Auftrag) zurück. Aber vor sowas nochmal ein <T> zu setzten ... hab' ich noch nie gesehen.
 
so ist es aber immer wenn irgendeine statische Methode generisch ist, sich nicht auf den generischen Parameter der Klassen-Definition verlassen kann,
z.B. Collections.sort():

Java:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
...
}
bzw. mit Comparator:
Java:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
...
}
 
Danke. Tja, wird denn wohl daran liegen, dass bisher alle meine generischen Methoden niemals statisch waren (sein mussten) ... Sieht aber auch echt abenteuerlich aus ... mann, mann, mann 😀
 

Zurück
Oben