Programming

최대 절전 모드를 사용할 때 매개 변수 값으로 쿼리 문자열을 인쇄하는 방법

procodes 2020. 2. 29. 15:34
반응형

최대 절전 모드를 사용할 때 매개 변수 값으로 쿼리 문자열을 인쇄하는 방법


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 튜토리얼 을 구현하는 간단한 튜토리얼 입니다.

나를 위해 그것은 매력처럼 일했습니다.

  1. P6Spy 라이브러리 다운로드

“p6spy-install.jar”을 얻습니다

  1. 그것을 추출

추출 p6spy-install.jar, 파일을 찾아 p6spy.jarspy.properties

  1. 라이브러리 의존성 추가

p6spy.jar프로젝트 라이브러리 의존성에 추가

  1. 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>
  1. 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
  1. “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에서 아래 강조 표시된 매개 변수를 사용할 수있는 경우

  1. org.hibernate.SQL은 쿼리를 보여줄 것이다

    logging.level.org.hibernate.SQL = DEBUG

  2. 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

최대 절전 모드에서 로그를 숨기도록 지시합니다.

사실은 기본으로 보인다!

참고 URL : https://stackoverflow.com/questions/1710476/how-to-print-a-query-string-with-parameter-values-when-using-hibernate



반응형