최대 절전 모드를 사용할 때 매개 변수 값으로 쿼리 문자열을 인쇄하는 방법
Hibernate에서 물음표 대신 실제 값으로 생성 된 SQL 쿼리를 인쇄 할 수 있습니까?
Hibernate API로 가능하지 않은 경우 실제 값으로 쿼리를 인쇄하도록 제안하는 방법은 무엇입니까?
다음 범주에 대한 로깅 을 활성화해야합니다 .
org.hibernate.SQL
-debug
실행될 때 모든 SQL DML 문을 기록 하도록 설정org.hibernate.type
-trace
모든 JDBC 매개 변수를 기록 하도록 설정
따라서 log4j 구성은 다음과 같습니다.
# logs the SQL statements
log4j.logger.org.hibernate.SQL=debug
# Logs the JDBC parameters passed to a query
log4j.logger.org.hibernate.type=trace
첫 번째는 hibernate.show_sql=true
레거시 속성 과 동일 하고 두 번째 는 바인딩 된 매개 변수를 무엇보다 인쇄합니다.
최대 절전 모드 기반이 아닌 다른 솔루션은 P6Spy 와 같은 JDBC 프록시 드라이버를 사용하는 것 입니다.
편의상 여기에 Logback (SLF4J)과 동일한 구성 예가 있습니다.
<appender name="SQLROLLINGFILE">
<File>/tmp/sql.log</File>
<rollingPolicy>
<FileNamePattern>logFile.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<Pattern>%-4date | %msg %n</Pattern>
</layout>
</appender>
<logger name="org.hibernate.SQL" additivity="false" >
<level value="DEBUG" />
<appender-ref ref="SQLROLLINGFILE" />
</logger>
<logger name="org.hibernate.type" additivity="false" >
<level value="TRACE" />
<appender-ref ref="SQLROLLINGFILE" />
</logger>
sql.log의 출력 (예)은 다음과 같습니다.
2013-08-30 18:01:15,083 | update stepprovider set created_at=?, lastupdated_at=?, version=?, bundlelocation=?, category_id=?, customer_id=?, description=?, icon_file_id=?, name=?, shareStatus=?, spversion=?, status=?, title=?, type=?, num_used=? where id=?
2013-08-30 18:01:15,084 | binding parameter [1] as [TIMESTAMP] - 2012-07-11 09:57:32.0
2013-08-30 18:01:15,085 | binding parameter [2] as [TIMESTAMP] - Fri Aug 30 18:01:15 CEST 2013
2013-08-30 18:01:15,086 | binding parameter [3] as [INTEGER] -
2013-08-30 18:01:15,086 | binding parameter [4] as [VARCHAR] - com.mypackage.foo
2013-08-30 18:01:15,087 | binding parameter [5] as [VARCHAR] -
2013-08-30 18:01:15,087 | binding parameter [6] as [VARCHAR] -
2013-08-30 18:01:15,087 | binding parameter [7] as [VARCHAR] - TODO
2013-08-30 18:01:15,087 | binding parameter [8] as [VARCHAR] -
2013-08-30 18:01:15,088 | binding parameter [9] as [VARCHAR] - MatchingStep@com.mypackage.foo
2013-08-30 18:01:15,088 | binding parameter [10] as [VARCHAR] - PRIVATE
2013-08-30 18:01:15,088 | binding parameter [11] as [VARCHAR] - 1.0
2013-08-30 18:01:15,088 | binding parameter [12] as [VARCHAR] - 32
2013-08-30 18:01:15,088 | binding parameter [13] as [VARCHAR] - MatchingStep
2013-08-30 18:01:15,089 | binding parameter [14] as [VARCHAR] -
2013-08-30 18:01:15,089 | binding parameter [15] as [INTEGER] - 0
2013-08-30 18:01:15,089 | binding parameter [16] as [VARCHAR] - 053c2e65-5d51-4c09-85f3-2281a1024f64
로 변경 hibernate.cfg.xml
:
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
"log4j.properties"에 log4j 및 아래 항목을 포함하십시오.
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
Log4JDBC는 데이터베이스에가는 정확한 SQL 을 인쇄 하지 않는 가장 인기있는 답변이 아닌 매개 변수로 인쇄하는 훌륭한 솔루션입니다 . 이것의 한 가지 주요 편의점은 SQL을 DB 프론트 엔드에 바로 복사하여 그대로 실행할 수 있다는 것입니다.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
후자는 또한 쿼리 결과를 표 형식으로 출력합니다.
쿼리의 결과 세트 테이블과 함께 params가있는 생성 된 SQL을 보여주는 샘플 출력 :
5. insert into ENQUIRY_APPLICANT_DETAILS (ID, INCLUDED_IN_QUOTE, APPLICANT_ID, TERRITORY_ID, ENQUIRY_ID, ELIGIBLE_FOR_COVER) values (7, 1, 11, 1, 2, 0)
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |ID |CREATED |DELETED |CODESET_ID |NAME |POSITION |PREFIX |
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |---|--------|--------|-----------|----------|---------|-------|
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |2 |null |null |1 |Country 2 |1 |60 |
10 Oct 2013 16:21:22 4953 [main] INFO jdbc.resultsettable - |---|--------|--------|-----------|----------|---------|-------|
2016 업데이트
가장 최근에는 SLF4j 및 logback과 함께 log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ )를 사용하고 있습니다. 설정에 필요한 Maven 종속성은 다음과 같습니다.
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>$logback.version}</version>
</dependency>
Driver와 DB Urls는 다음과 같습니다.
database.driver.class=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
database.url=jdbc:log4jdbc:hsqldb:mem:db_name #Hsql
#database.url=jdbc:log4jdbc:mysql://localhost:3306/db_name
내 logback.xml 구성 파일은 다음과 같습니다. 그러면 모든 쿼리에 대한 매개 변수와 결과 집합 테이블이있는 모든 SQL 문이 출력됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="jdbc.audit" level="ERROR" />
<logger name="jdbc.connection" level="ERROR" />
<logger name="jdbc.sqltiming" level="ERROR" />
<logger name="jdbc.resultset" level="ERROR" />
<!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT -->
<!--<logger name="jdbc.resultsettable" level="ERROR" /> -->
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
마지막으로 클래스 경로의 루트 (예 : Mevn 프로젝트의 src / test / resources 또는 src / main / resources)에 log4jdbc.log4j2.properties라는 파일을 작성해야했습니다. 이 파일에는 아래의 한 줄이 있습니다.
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
위의 내용은 로깅 라이브러리에 따라 다릅니다. 의 문서를 참조하십시오 https://code.google.com/archive/p/log4jdbc-log4j2 추가 정보를
샘플 출력 :
10:44:29.400 [main] DEBUG jdbc.sqlonly - org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70)
5. select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id
as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_,
role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer
join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=104
10:44:29.402 [main] INFO jdbc.resultsettable -
|----------|---|---|----------|--------|---|-----|
|member_id |id |id |member_id |role_id |id |name |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|
스프링 부트를 사용하는 경우 다음을 구성하십시오.
aplication.yml
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.type: TRACE
aplication.properties
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
그리고 더 이상 없습니다.
HTH
log4j.xml에 카테고리 행을 추가 할 수 있습니다.
<category name="org.hibernate.type">
<priority value="TRACE"/>
</category>
최대 절전 모드 속성을 추가하십시오.
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
log4j 또는 logback 구성에 다음 특성 및 값을 추가하십시오.
org.hibernate.sql=DEBUG
org.hibernate.type.descriptor.sql.BasicBinder=TRACE
이 게시물 에서 설명한 것처럼 datasource-proxy를 사용하여 수행 할 수 있습니다 .
애플리케이션이 dataSource
빈을 예상한다고 가정하면 (예 :을 통해 @Resource
) 다음과 같이 구성 할 수 있습니다 datasource-proxy
.
<bean id="actualDataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init"
destroy-method="close">
<property name="className" value="bitronix.tm.resource.jdbc.lrc.LrcXADataSource"/>
<property name="uniqueName" value="actualDataSource"/>
<property name="minPoolSize" value="0"/>
<property name="maxPoolSize" value="5"/>
<property name="allowLocalTransactions" value="false" />
<property name="driverProperties">
<props>
<prop key="user">${jdbc.username}</prop>
<prop key="password">${jdbc.password}</prop>
<prop key="url">${jdbc.url}</prop>
<prop key="driverClassName">${jdbc.driverClassName}</prop>
</props>
</property>
</bean>
<bean id="proxyDataSource" class="net.ttddyy.dsproxy.support.ProxyDataSource">
<property name="dataSource" ref="testDataSource"/>
<property name="listener">
<bean class="net.ttddyy.dsproxy.listener.ChainListener">
<property name="listeners">
<list>
<bean class="net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener">
<property name="logLevel" value="INFO"/>
</bean>
<bean class="net.ttddyy.dsproxy.listener.DataSourceQueryCountListener"/>
</list>
</property>
</bean>
</property>
</bean>
<alias name="proxyDataSource" alias="dataSource"/>
이제 최대 절전 모드 출력 대 데이터 소스 프록시 :
INFO [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:1, Num:1, Query:{[select company0_.id as id1_6_, company0_.name as name2_6_ from Company company0_][]}
INFO [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into WarehouseProductInfo (id, quantity) values (default, ?)][19]}
INFO [main]: n.t.d.l.CommonsQueryLoggingListener - Name:, Time:0, Num:1, Query:{[insert into Product (id, code, company_id, importer_id, name, version) values (default, ?, ?, ?, ?, ?)][phoneCode,1,-5,Phone,0]}
datasource-proxy
쿼리 매개 변수 값을 포함하고 당신이 할 수 있도록 당신은 사용자 정의 JDBC 문 인터셉터를 추가 할 수 있습니다 바로 통합 테스트에서 N + 1 쿼리 문제를 잡아 .
org.hibernate.type
로거를 켜서 실제 매개 변수가 물음표에 어떻게 바인딩되는지 확인하십시오.
<!-- A time/date based rolling appender -->
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/system.log" />
<param name="Append" value="true" />
<param name="ImmediateFlush" value="true" />
<param name="MaxFileSize" value="200MB" />
<param name="MaxBackupIndex" value="100" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
</layout>
</appender>
<appender name="journaldev-hibernate" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/project.log" />
<param name="Append" value="true" />
<param name="ImmediateFlush" value="true" />
<param name="MaxFileSize" value="200MB" />
<param name="MaxBackupIndex" value="50" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" />
</layout>
</appender>
<logger name="com.journaldev.hibernate" additivity="false">
<level value="DEBUG" />
<appender-ref ref="journaldev-hibernate" />
</logger>
<logger name="org.hibernate" additivity="false">
<level value="INFO" />
<appender-ref ref="FILE" />
</logger>
<logger name="org.hibernate.type" additivity="false">
<level value="TRACE" />
<appender-ref ref="FILE" />
</logger>
<root>
<priority value="INFO"></priority>
<appender-ref ref="FILE" />
</root>
솔루션은 정확하지만 결과 개체에 대한 모든 바인딩도 기록합니다. 이를 방지하기 위해 별도의 어 펜더를 작성하고 필터링을 사용하는 것이 가능합니다.
<!-- 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>
**If you want hibernate to print generated sql queries with real values instead of question marks.**
**add following entry in hibernate.cfg.xml/hibernate.properties:**
show_sql=true
format_sql=true
use_sql_comments=true
**And add following entry in 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
이 답변은 질문에 약간의 차이가 있습니다. 때로는 런타임에서 디버그 목적으로 만 SQL이 필요합니다. 이 경우 편집기에서 디버그를 사용하여 더 쉬운 방법이 있습니다.
- org.hibernate.loader.Loader.loadEntityBatch에 중단 점을 두십시오 (또는 스택이있을 때까지 탐색하십시오).
- 실행이 일시 중단되면 변수 this.sql의 값을보십시오.
이것은 최대 절전 모드 3입니다.이 버전이 다른 버전에서 작동하는지 잘 모르겠습니다.
mysql jdbc 드라이버는 이미이 요구 사항을 충족시키는 편리한 기능을 제공하고 있습니다. 최소한 jar 버전이> = mysql-connect-jar-5.1.6.jar이어야합니다.
1 단계 : [로거 및 사용자 정의 로깅을 추가하도록 jdbc.url 구성]
jdbc.url=jdbc:mysql://host:port/your_db?logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true&profilerEventHandler=com.xxx.CustomLoggingProfilerEventHandler
이제 slf4j 로깅을 사용 중입니다. 기본 로깅이 log4j 인 경우 slf4j 로깅을 사용하려면 slf4j-api, slf4j-log4j12 종속성을 추가해야합니다.
2 단계 : [맞춤 로깅 작성]
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 this.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();
}
}
나는 log4j에 이것을 좋아한다.
log4j.logger.org.hibernate.SQL=trace
log4j.logger.org.hibernate.engine.query=trace
log4j.logger.org.hibernate.type=trace
log4j.logger.org.hibernate.jdbc=trace
log4j.logger.org.hibernate.type.descriptor.sql.BasicExtractor=error
log4j.logger.org.hibernate.type.CollectionType=error
로깅은 작동하지만 정확히 원하는 것은 아니지만 얼마 전에 원했지만 P6Spy 는 완벽하게 작동 합니다 .
다음은 P6Spy 용 MKYONG 튜토리얼 을 구현하는 간단한 튜토리얼 입니다.
나를 위해 그것은 매력처럼 일했습니다.
- P6Spy 라이브러리 다운로드
“p6spy-install.jar”을 얻습니다
- 그것을 추출
추출 p6spy-install.jar
, 파일을 찾아 p6spy.jar
및spy.properties
- 라이브러리 의존성 추가
p6spy.jar
프로젝트 라이브러리 의존성에 추가
- P6Spy 속성 파일 수정
데이터베이스 구성 파일을 수정하십시오. 기존 JDBC 드라이버를 P6Spy JDBC 드라이버로 교체해야합니다.com.p6spy.engine.spy.P6SpyDriver
원본은 MySQL JDBC 드라이버입니다. com.mysql.jdbc.Driver
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
</session-factory>
P6Spy JDBC 드라이버로 변경 – com.p6spy.engine.spy.P6SpyDriver
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver
</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
</session-factory>
- P6Spy 속성 파일 수정 P6Spy 속성 파일 수정 –
spy.properties
real driver
기존 MySQL JDBC 드라이버로 교체
realdriver=com.mysql.jdbc.Driver
#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=
로그 파일 위치 변경 logfile 특성에서 로그 파일 위치를 변경하면 모든 SQL 문이이 파일에 로그인합니다.
윈도우
logfile = c:/spy.log
*아니야
logfile = /srv/log/spy.log
“spy.properties”
프로젝트 클래스 경로로 복사
“spy.properties”
프로젝트 루트 폴더에 복사 하여 프로젝트가 "spy.properties"를 찾을 수 있는지 확인하십시오. 그렇지 않으면 “spy.properties”
파일을 찾을 수 없음 예외가 표시됩니다.
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
</layout>
</appender>
<logger name="org.hibernate" additivity="false">
<level value="INFO" />
<appender-ref ref="console" />
</logger>
<logger name="org.hibernate.type" additivity="false">
<level value="TRACE" />
<appender-ref ref="console" />
</logger>
Hibernate 4 및 slf4j / log4j2 사용하여 log4j2.xml 구성에 다음을 추가하려고했습니다.
<Logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.hibernate.type.EnumType" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
그러나 성공하지 못했습니다.
이 스레드 를 통해 최대 절전 모드에서 사용되는 jboss 로깅 프레임 워크가 slf4j를 통해 로깅하기 위해 구성되어야한다는 것을 알았습니다. 응용 프로그램의 VM 인수에 다음 인수를 추가했습니다.
-Dorg.jboss.logging.provider=slf4j
그리고 그것은 매력처럼 작동했습니다.
log4j.file에서 아래 속성을 설정하여 나를 위해 일한 것은 다음과 같습니다.
log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
동면 속성 설정 :
hibernate.show_sql=true
최대 절전 모드 3.2.xx를 사용하는 경우
log4j.logger.org.hibernate.SQL=trace
대신에
log4j.logger.org.hibernate.SQL=debug
이것을 기록 할 수 있습니다 :
net.sf.hibernate.hql.QueryTranslator
출력 예 :
2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] HQL: select noti.id, noti.idmicrosite, noti.fcaducidad, noti.fpublicacion, noti.tipo, noti.imagen, noti.visible, trad.titulo, trad.subtitulo, trad.laurl, trad.urlnom, trad.fuente, trad.texto from org.ibit.rol.sac.micromodel.Noticia noti join noti.traducciones trad where index(trad)='ca' and noti.visible='S' and noti.idmicrosite=985 and noti.tipo=3446
2013-10-31 14:56:19,029 DEBUG [net.sf.hibernate.hql.QueryTranslator] SQL: select noticia0_.NOT_CODI as x0_0_, noticia0_.NOT_MICCOD as x1_0_, noticia0_.NOT_CADUCA as x2_0_, noticia0_.NOT_PUBLIC as x3_0_, noticia0_.NOT_TIPO as x4_0_, noticia0_.NOT_IMAGEN as x5_0_, noticia0_.NOT_VISIB as x6_0_, traduccion1_.NID_TITULO as x7_0_, traduccion1_.NID_SUBTIT as x8_0_, traduccion1_.NID_URL as x9_0_, traduccion1_.NID_URLNOM as x10_0_, traduccion1_.NID_FUENTE as x11_0_, traduccion1_.NID_TEXTO as x12_0_ from GUS_NOTICS noticia0_ inner join GUS_NOTIDI traduccion1_ on noticia0_.NOT_CODI=traduccion1_.NID_NOTCOD where (traduccion1_.NID_CODIDI='ca' )and(noticia0_.NOT_VISIB='S' )and(noticia0_.NOT_MICCOD=985 )and(noticia0_.NOT_TIPO=3446 )
Log4Jdbc 플러그인이 요구 사항에 가장 적합합니다. 그것은 다음을 보여줍니다-
1. Complete SQL query being hit to the db
2. Parameter values being passed to the query
3. Execution time taken by each query
Log4Jdbc-를 구성하려면 아래 링크를 참조하십시오.
https://code.google.com/p/log4jdbc/
Wireshark 또는 이와 유사한 것을 사용하십시오 .
위에서 언급 한 답변 중 어느 것도 매개 변수가있는 SQL을 올바르게 인쇄하지 못하거나 고통스럽지 않습니다. WireShark 을 사용하여이를 달성했습니다 .이 쿼리는 응용 프로그램에서 Oracle / Mysql 등으로 전송되는 모든 SQL / 명령을 쿼리로 캡처합니다.
여기에있는 모든 대답이 도움이되지만 Spring 응용 프로그램 컨텍스트 XML을 사용하여 세션 팩토리를 설정하는 경우 log4j SQL 수준 변수를 설정하면 거기에있는 방법의 일부만 얻을 수 있으며 hibernate.show_sql 변수도 설정해야합니다 앱 컨텍스트 자체에서 Hibernate가 실제로 값을 표시하기 시작합니다.
ApplicationContext.xml에는 다음이 있습니다.
<property name="hibernateProperties">
<value>
hibernate.jdbc.batch_size=25
... <!-- Other parameter values here -->
hibernate.show_sql=true
</value>
</property>
그리고 log4j 파일이 필요합니다
log4j.logger.org.hibernate.SQL=DEBUG
자바에서 :
CriteriaQuery (javax.persistence) 인 경우 TypedQuery에서 쿼리를 변환하십시오.
그때:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
Wildfly (standalone.xml)로 개발하려면 다음 로거를 추가하십시오.
<logger category="org.hibernate.SQL">
<level name="DEBUG"/>
</logger>
<logger category="org.hibernate.type.descriptor.sql">
<level name="TRACE"/>
</logger>
최대 절전 모드는 쿼리와 해당 매개 변수 값을 다른 줄에 표시합니다.
스프링 부트에서 application.properties를 사용하고 있고 application.properties에서 아래 강조 표시된 매개 변수를 사용할 수있는 경우
org.hibernate.SQL은 쿼리를 보여줄 것이다
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type은 모든 매개 변수 값을 보여 주며, select, insert 및 update 쿼리로 매핑됩니다. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType은 열거 형 매개 변수 값을 보여줍니다
logging.level.org.hibernate.type.EnumType = TRACE
예 ::
2018-06-14 11:06:28,217 TRACE [main] [EnumType.java : 321] Binding [active] to parameter: [1]
sql.BasicBinder는 정수, varchar, 부울 유형 매개 변수 값을 표시합니다
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
예 ::
- 2018-06-14 11 : 28 : 29,750 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] [BOOLEAN]-[true]와 같은 바인딩 매개 변수 [1]
- 2018-06-14 11 : 28 : 29,751 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] 바인딩 매개 변수 [2]를 [INTEGER]-[1]
- 2018-06-14 11 : 28 : 29,752 TRACE [http-nio-9891-exec-2] [BasicBinder.java : 65] [VARCHAR]-[public]과 같은 바인딩 매개 변수 [3]
가장 간단한 해결책은 일반 stringReplace를 구현하여 매개 변수 입력을 매개 변수 값으로 바꾸는 것입니다 (간단하게 모든 매개 변수를 문자열로 처리).
String debugedSql = sql;
//then, for each named parameter
debugedSql = debugedSql.replaceAll(":"+key, "'"+value.toString()+"'");
//and finnaly
println(debugedSql);
또는 위치 매개 변수 (?)와 유사한 것.
실행 준비된 SQL을 기록하려면 널값과 날짜와 같은 특정 값 유형을 관리하십시오.
스프링 부트 및 JPA를 사용하는 경우
spring.jpa.properties.hibernate.show_sql=false
최대 절전 모드에서 로그를 숨기도록 지시합니다.
사실은 기본으로 보인다!
'Programming' 카테고리의 다른 글
왜 document.write가 "나쁜 습관"으로 간주됩니까? (0) | 2020.02.29 |
---|---|
스칼라 : TypeTag 란 무엇이며 어떻게 사용합니까? (0) | 2020.02.29 |
자식에서 병합을 미리 볼 수 있습니까? (0) | 2020.02.28 |
자바 : notify () 대 notifyAll () 다시 (0) | 2020.02.28 |
실제 터미널 화면 지우기 (0) | 2020.02.28 |