Ist es in Hibernate möglich, generierte SQL-Abfragen mit echten Werten anstelle von Fragezeichen zu drucken?
Wie würden Sie vorschlagen, um Abfragen mit echten Werten zu drucken, wenn es nicht möglich ist, mit Hibernate API?
Ist es in Hibernate möglich, generierte SQL-Abfragen mit echten Werten anstelle von Fragezeichen zu drucken?
Wie würden Sie vorschlagen, um Abfragen mit echten Werten zu drucken, wenn es nicht möglich ist, mit Hibernate API?
Der MySQL JDBC-Treiber bietet bereits eine praktische Funktion, um diese Anforderung zu erfüllen. Sie müssen mindestens die JAR-Version größer oder gleich 5.1.6 haben (z.B. mysql-connect-jar-5.1.6.jar
)
Konfigurieren Sie jdbc.url
um Ihren Logger und die benutzerdefinierte Protokollierung hinzuzufügen:
jdbc.url=jdbc:mysql://host:port/your_db?logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true&profilerEventHandler=com.xxx.CustomLoggingProfilerEventHandler
Sie verwendet slf4j
Protokollierung, wenn Ihre Standardprotokollierung auf log4j
müssen Sie hinzufügen slf4j-api
y slf4j-log4j12
als Abhängigkeiten zu verwenden slf4j
Protokollierung:
Schreiben Sie Ihren eigenen Protokollierungscode:
package com.xxx;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.log.Log;
public class CustomLoggingProfilerEventHandler implements ProfilerEventHandler {
private Log log;
public LoggingProfilerEventHandler() {
}
public void consumeEvent(ProfilerEvent evt) {
/**
* you can only print the sql as his.log.logInfo(evt.getMessage())
* you can adjust your sql print log level with: DEBUG,INFO
* you can also handle the message to meet your requirement
*/
this.log.logInfo(evt);
}
public void destroy() {
this.log = null;
}
public void init(Connection conn, Properties props) throws SQLException {
this.log = conn.getLog();
}
}
Wenn Sie möchten, dass Hibernate generierte SQL-Abfragen mit echten Werten anstelle von Fragezeichen ausgibt, fügen Sie folgende Einträge zu hibernate.cfg.xml/hibernate.properties
:
show_sql=true
format_sql=true
use_sql_comments=true
Und fügen Sie folgende Einträge zu log4j.properties
:
log4j.logger.org.hibernate=INFO, hb
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
log4j.appender.hb=org.apache.log4j.ConsoleAppender
log4j.appender.hb.layout=org.apache.log4j.PatternLayout
Hibernate zeigt Abfragen und ihre Parameterwerte in verschiedenen Zeilen an.
Wenn Sie Folgendes verwenden application.properties
in Spring Boot und Sie können den unten hervorgehobenen Parameter in application.properties
.
org.hibernate.SQL
werden Abfragen angezeigt:
logging.level.org.hibernate.SQL=DEBUG
org.hibernate.type
werden alle Parameterwerte angezeigt, die mit select
, insert
y update
Rückfragen.
logging.level.org.hibernate.type=TRACE
org.hibernate.type.EnumType
zeigt den Wert des Enum-Parameters an:
logging.level.org.hibernate.type.EnumType=TRACE
Beispielhafte Ausgabe:
2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
sql.BasicBinder
zeigt Parameterwerte vom Typ Integer, Varchar und Boolean an
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Beispielhafte Ausgabe:
* 2018-06-14 11:28:29,750 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [1] as [BOOLEAN] - [true]
* 2018-06-14 11:28:29,751 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [2] as [INTEGER] - [1]
* 2018-06-14 11:28:29,752 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] binding parameter [3] as [VARCHAR] - [public]
Die Lösung ist korrekt, protokolliert aber auch alle Bindungen für die Ergebnisobjekte. Um dies zu verhindern, ist es möglich, einen separaten Appender zu erstellen und die Filterung zu aktivieren. Zum Beispiel:
<!-- A time/date based rolling appender -->
<appender name="FILE_HIBERNATE" class="org.jboss.logging.appender.DailyRollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.log.dir}/hiber.log"/>
<param name="Append" value="false"/>
<param name="Threshold" value="TRACE"/>
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="bind" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="select" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>
<category name="org.hibernate.type">
<priority value="TRACE"/>
</category>
<logger name="org.hibernate.type">
<level value="TRACE"/>
<appender-ref ref="FILE_HIBERNATE"/>
</logger>
<logger name="org.hibernate.SQL">
<level value="TRACE"/>
<appender-ref ref="FILE_HIBERNATE"/>
</logger>
Log4Jdbc Plugin wäre für Ihre Anforderungen am besten geeignet. Es zeigt folgendes an
1. Complete SQL query being hit to the db
2. Parameter values being passed to the query
3. Execution time taken by each query
Siehe untenstehenden Link zur Konfiguration von Log4Jdbc-
https://code.google.com/p/log4jdbc/
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.