سؤال

أنا أتعلم عن عجائب JdbcTemplate و NamedParameterJdbcTemplate.أنا أحب ما أرى ولكن هل هناك أي طريقة سهلة لمعرفة الأساسية SQL أنه ينتهي تنفيذ?أود أن أرى هذا التصحيح الأغراض (لكي على سبيل المثال تصحيح SQL الناتج في الخارج أداة).

هل كانت مفيدة؟

المحلول

على الربيع الوثائق يقول أنهم تسجيل في مستوى التصحيح:

كل SQL الصادرة عن هذه الفئة يتم تسجيل في التصحيح مستوى تحت الفئة المقابلة مؤهل بشكل كامل اسم الفئة القالب سبيل المثال (عادة JdbcTemplate ، ولكن قد تكون مختلفة إذا كنت تستخدم مخصص فرعية من JdbcTemplate الدرجة).

في XML حيث تحتاج إلى تكوين مسجل شيئا مثل:

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

هذا الموضوع ومع ذلك تمت مناقشتها هنا قبل شهر و يبدو ليس من السهل الحصول على العمل كما في السبات و/أو لم العائد المتوقع معلومات: الربيع JDBC لا تسجيل SQL مع log4j هذا الموضوع تحت كل يشير إلى استخدام P6Spy والتي يمكن أيضا أن تكون متكاملة في الربيع وفقا هذه المادة.

نصائح أخرى

ويعمل هذا بالنسبة لي مع org.springframework.jdbc-3.0.6.RELEASE.jar. لم أجد هذا في أي مكان في مستندات الربيع (ربما أنا مجرد كسول) ولكنني وجدت (التجربة والخطأ) أن مستوى 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

ومجرد نسخ / الماضي

وHTH

وأنا استخدم هذا الخط لتطبيقات الربيع التمهيد:

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