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

Hibernate에서 물음표 대신 실제 값으로 생성 된 SQL 쿼리를 인쇄 할 수 있습니까?

Hibernate API로 가능하지 않은 경우 실제 값으로 쿼리를 인쇄하도록 제안하는 방법은 무엇입니까?



답변

다음 범주에 대한 로깅 을 활성화해야합니다 .

  • org.hibernate.SQL   – debug실행될 때 모든 SQL DML 문을 기록 하도록 설정
  • org.hibernate.typetrace모든 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


답변

스프링 부트를 사용하는 경우 다음을 구성하십시오.

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


답변

Log4JDBC는 정확한 것을 인쇄하는 훌륭한 솔루션입니다. 데이터베이스에가는 SQL 하지 않는 가장 인기있는 답변이 아닌 매개 변수로 . 이것의 한 가지 주요 편의점은 SQL을 DB 프론트 엔드에 바로 복사하여 그대로 실행할 수 있다는 것입니다.

http://log4jdbc.sourceforge.net/

https://code.google.com/p/log4jdbc-remix/

후자는 또한 쿼리 결과를 표 형식으로 출력합니다.

쿼리의 결과 세트 테이블과 함께 매개 변수가있는 생성 된 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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|


답변

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