Вопрос

Я узнаю о чудесах JdbcTemplate и NamedParameterJdbcTemplate.Мне нравится то, что я вижу, но есть ли какой-нибудь простой способ увидеть базовый SQL, который он в конечном итоге выполняет?Я хотел бы видеть это в целях отладки (например, для отладки результирующего SQL во внешнем инструменте).

Это было полезно?

Решение

Тот Самый Весенняя документация говорит, что они зарегистрированы на уровне ОТЛАДКИ:

Весь SQL, выданный этим классом, регистрируется на ОТЛАЖИВАТЬ уровень под Категория соответствующий полной квалификации название класса экземпляра шаблона (обычно JdbcTemplate, но он может отличаться, если вы используете пользовательский подкласс класса JdbcTemplate).

В терминах XML вам нужно настроить регистратор примерно так:

<category name="org.springframework.jdbc.core.JdbcTemplate">
    <priority value="debug" />
</category>

Однако этот вопрос обсуждался здесь месяц назад, и, похоже, приступить к работе не так просто, как в режиме гибернации, и / или он не вернул ожидаемую информацию: Spring JDBC не регистрирует SQL с помощью log4j В этом разделе под каждым предлагается использовать P6шпион который также может быть интегрирован весной в соответствии эта статья.

Другие советы

У меня это работает с org.springframework.jdbc-3.0.6.RELEASE.jar.Я не смог найти этого нигде в документации Spring (возможно, я просто ленив), но обнаружил (методом проб и ошибок), что уровень TRACE творит чудеса.

Я использую log4j-1.2.15 вместе с slf4j (1.6.4) и файлом свойств для настройки log4j:

log4j.logger.org.springframework.jdbc.core = TRACE

Это отображает как оператор SQL, так и связанные параметры следующим образом:

Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME]
Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown
Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown
Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown

Не уверен насчет неизвестного типа SQL, но думаю, здесь мы можем его проигнорировать.

Только для SQL (т.если вас не интересуют связанные значения параметров) DEBUG должно быть достаточно.

Значения параметров, похоже, печатаются на уровне TRACE.Это сработало для меня:

log4j.logger.org.springframework.jdbc.core.JdbcTem plate=DEBUG, file
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file

Вывод консоли:

02:40:56,519 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 1, parameter value [Tue May 31 14:00:00 CEST 2005], value class [java.util.Date], SQL type unknown
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 2, parameter value [61], value class [java.lang.Integer], SQL type unknown
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 3, parameter value [80], value class [java.lang.Integer], SQL type unknown

У меня это сработало с параметрами log4j2 и xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
    <Properties>
        <Property name="log-path">/some_path/logs/</Property>
        <Property name="app-id">my_app</Property>
    </Properties>

    <Appenders>
        <RollingFile name="file-log" fileName="${log-path}/${app-id}.log"
            filePattern="${log-path}/${app-id}-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>

        <Logger name="org.springframework.jdbc.core" level="trace" additivity="false">
            <appender-ref ref="file-log" />
            <appender-ref ref="console" />
        </Logger>

        <Root level="info" additivity="false">
            <appender-ref ref="file-log" />
            <appender-ref ref="console" />
        </Root>
    </Loggers>

</Configuration>

Консоль результатов и журнал файлов были:

JdbcTemplate - Executing prepared SQL query
JdbcTemplate - Executing prepared SQL statement [select a, b from c where id = ? ]
StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [my_id], value class [java.lang.String], SQL type unknown

Просто скопируйте/вставьте

ХТХ

Я использую эту строку для приложений Spring Boot:

logging.level.org.springframework.jdbc.core = TRACE

Этот подход довольно универсальный, и я обычно использую его для любых других классов внутри моего приложения.

Я не уверен на 100%, что вы имеете в виду, поскольку обычно вы передаете свои SQL-запросы (параметризованные или нет) в JdbcTemplate, и в этом случае вы просто записываете их.Если у вас есть PreparedStatements, и вы не знаете, какой из них выполняется, toString метод должен работать нормально.Но раз уж мы заговорили об этой теме, есть хороший пакет логгера Jdbc. здесь который позволит вам автоматически регистрировать ваши запросы, а также каждый раз видеть связанные параметры.Очень полезно.Вывод выглядит примерно так:

executing PreparedStatement: 'insert into ECAL_USER_APPT
(appt_id, user_id, accepted, scheduler, id) values (?, ?, ?, ?, null)'
     with bind parameters: {1=25, 2=49, 3=1, 4=1} 

Попробуйте добавить в log4j.xml

<!--  enable query logging -->
<category name="org.springframework.jdbc.core.JdbcTemplate">
    <priority value="DEBUG" />
</category>

<!-- enable query logging for SQL statement parameter value -->
<category name="org.springframework.jdbc.core.StatementCreatorUtils">
    <priority value="TRACE" />
</category>

ваши журналы выглядят так:

DEBUG JdbcTemplate:682 - Executing prepared SQL query
DEBUG JdbcTemplate:616 - Executing prepared SQL statement [your sql query]
TRACE StatementCreatorUtils:228 - Setting SQL statement parameter value: column index 1, parameter value [param], value class [java.lang.String], SQL type unknown
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top