2016-07-11 7 views
1

Wir haben Probleme herauszufinden, warum die Verwendung von SetParameter auf ExecuteUpdate Abfragen im Vergleich zur Verwendung von SetString, setLong langsamer sind.Hibernate SQLQueryImpl setParameter vs setString

SQLQueryImpl query = session.createSQLQuery("update message set status = :status where attempt_id = :attemptId") 

Jedes Mal, wenn ich benutze:

query.setParameter("status", Status.DONE) 
query.setParameter("attemptId", id) 

Es ist fast 10x langsamer löst im Vergleich zur Verwendung:

query.setString("status", Status.DONE.toString()) 
query.setLong("attemptId", id) 

ich überprüfen kann, dass sie ähnliche Abfragen unter generiert:

update message set status = ? where attempt_id = ? 

Warum ist se tParameter() langsamer?

Nutzt setString(), setLong() bevorzugt über setParameter() verwendet

Ich dachte, es kommt noch hinzu, eine Schicht, die herausfindet, welche Art fast gleich hinzuzufügen, aber sollte es sein.

Antwort

2

Eine Überprüfung des Quellcodes für AbstractQueryImpl wird zeigen warum. Kurz gesagt, es muss herausfinden, welche Type Parameter Sie setzen, was teuer ist (und verschwenderisch, da Sie wissen sollten, was Sie injizieren).

public Query setParameter(String name, Object val) throws HibernateException { 
    if (val == null) { 
     Type type = parameterMetadata.getNamedParameterExpectedType(name); 
     if (type == null) { 
      type = StandardBasicTypes.SERIALIZABLE; 
     } 
     setParameter(name, val, type); 
    } 
    else { 
     // determineType() method below is expensive 
     setParameter(name, val, determineType(name, val)); 
    } 

Vergleichen Sie jetzt setString(), die nicht die Type zu bestimmen hat und setzt sie explizit statt:

public Query setString(int position, String val) { 
    setParameter(position, val, StandardBasicTypes.STRING); 
    return this; 
} 

Mit setString oder setLong auch mehr streng typisierte pro der Methodensignatur, die ist in der Regel das, was Sie wollen (besser zum Kompilieren als zur Laufzeit).