P6Spy не регистрирует SQL

У меня есть программа, которая обновляет таблицы в базе данных с помощью подготовленных операторов, и я пытаюсь увидеть вывод всех реализованных операторов SQL.

Мое исследование предложило P6Spy, который выглядел великолепно, я скачал его, добавил P6Spy.jar в качестве зависимости в свою библиотеку, изменил файл spy.properties для подключения для использования драйвера oracle в качестве реального драйвера, добавил spy.properties в свой путь к классам. , и изменил драйвер на "com.p6spy.engine.spy.P6SpyDriver" в моем коде.

Все работает, файл spy.log генерируется, НО НЕ СОДЕРЖИТ SQL-ЗАЯВЛЕНИЙ. Вместо этого вывод в файле spy.log:

1374244954573|-1||debug||com.p6spy.engine.common.P6SpyOptions reloading properties
1374244954578|-1||info||Using properties file: C:\Users\gboss\logging\spy.properties
1374244954579|-1||info||No value in environment for: getStackTrace, using: false
1374244954579|-1||info||No value in environment for: getDeregisterDrivers, using: false
1374244954579|-1||info||No value in environment for: getUsePrefix, using: false
1374244954579|-1||info||No value in environment for: getExecutionThreshold, using: 0
1374244954579|-1||info||No value in environment for: getAutoflush, using: true
1374244954579|-1||info||No value in environment for: getExclude, using: 
1374244954579|-1||info||No value in environment for: getExcludecategories, using: info,debug,result,batch
1374244954579|-1||info||No value in environment for: getFilter, using: true
1374244954579|-1||info||No value in environment for: getInclude, using: 
1374244954579|-1||info||No value in environment for: getIncludecategories, using: 
1374244954579|-1||info||No value in environment for: getLogfile, using: c:/spy.log
1374244954579|-1||info||No value in environment for: getAppender, using: com.p6spy.engine.logging.appender.FileLogger
1374244954579|-1||info||No value in environment for: getRealdriver, using: oracle.jdbc.driver.OracleDriver
1374244954579|-1||info||No value in environment for: getRealdriver2, using: 
1374244954580|-1||info||No value in environment for: getRealdriver3, using: 
1374244954580|-1||info||No value in environment for: getAppend, using: true
1374244954580|-1||info||No value in environment for: getSpydriver, using: com.p6spy.engine.spy.P6SpyDriver
1374244954580|-1||info||No value in environment for: getDateformat, using: 
1374244954580|-1||info||No value in environment for: getDateformatter, using: null
1374244954580|-1||info||No value in environment for: getStringmatcher, using: com.p6spy.engine.common.SubstringMatcher
1374244954580|-1||info||No value in environment for: getStringMatcherEngine, using: com.p6spy.engine.common.SubstringMatcher@13aaa14a
1374244954580|-1||info||No value in environment for: getStackTraceClass, using: 
1374244954580|-1||info||No value in environment for: getSQLExpression, using: null
1374244954580|-1||info||No value in environment for: getReloadProperties, using: false
1374244954580|-1||info||No value in environment for: getReloadPropertiesInterval, using: 60
1374244954580|-1||info||No value in environment for: getJNDIContextFactory, using: null
1374244954580|-1||info||No value in environment for: getJNDIContextProviderURL, using: null
1374244954580|-1||info||No value in environment for: getJNDIContextCustom, using: null
1374244954580|-1||info||No value in environment for: getRealDataSource, using: null
1374244954580|-1||info||No value in environment for: getRealDataSourceClass, using: null
1374244954580|-1||info||No value in environment for: getRealDataSourceProperties, using: null

кто-нибудь имеет опыт использования P6Spy и знает, в чем проблема? Я читал, что spy.log должен просто генерировать операторы sql после выполнения всех действий, которые я сделал, и запуска программы, поэтому я здесь довольно запутался.

EDIT -- База данных была обновлена, поэтому операторы SQL прошли и обновили базу данных.


person user22    schedule 19.07.2013    source источник
comment
Я заметил ваш более поздний вопрос: stackoverflow. com/questions/17789223/ . Означает ли это, что это было решено для вас? Если да, не могли бы вы сами дать ответ и принять его, чтобы другие, борющиеся с той же проблемой, также могли извлечь из этого пользу? Спасибо.   -  person Peter Butkovic    schedule 09.09.2013


Ответы (2)


Обычно это вызвано тем, что P6SpyDriver регистрируется в DriverManager после регистрации вашего реального драйвера JDBC. P6Spy 1.3 не требовал от вас изменения URL-адреса JDBC. Когда код приложения (или сервер приложений) пытается получить подходящий драйвер из DriverManager, он циклически перебирает зарегистрированные драйверы, чтобы найти первый, который обрабатывает URL-адрес. Если P6SpyDriver не зарегистрирован перед настоящим драйвером, то он не будет использоваться.

Есть два способа решить эту проблему:

  1. Установите 'deregisterdrivers=true' в ваших spy.properties.

Это приведет к тому, что P6Spy отменит регистрацию реального драйвера, а затем перерегистрирует его. Это заставит DriverManager использовать P6SpyDriver. Однако с Java 6+ вы должны убедиться, что класс драйвера, который вы указали для реального драйвера, соответствует тому, который будет автоматически зарегистрирован. Вы можете получить это имя класса из META-INF/services/java.sql.Driver. Если этот файл не существует в файле JAR для драйвера JDBC, то он не поддерживает автоматическую регистрацию.

  1. Установите «useprefix=true» в spy.properties и измените URL-адрес JDBC, чтобы добавить префикс «p6spy:».

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

См. http://p6spy.github.io/p6spy/1.3/configandusage.html для различных вариантов конфигурации, доступных в версии 1.3.

person quintonm    schedule 31.01.2014
comment
Привет @quintonm Я думаю, ты имеешь в виду Set 'useprefix=true', верно?? - person mounaim; 18.06.2014
comment
приветствую вас :) Эта проблема с тем, что P6Spy все еще не регистрирует запросы sql, все еще сохраняется для меня: / жаль, что P6Spy будет полезен для меня. - person mounaim; 19.06.2014
comment
@quintonm Вы действительно предлагаете указать set 'deregisteddrivers=false (что уже установлено по умолчанию)? - person Rafael Chaves; 19.01.2015
comment
У меня аналогичная проблема для v2.4.1. Но этих свойств нет. Любое предложение? - person Davut Gürbüz; 09.07.2015

У меня была та же проблема, и я не мог заставить ее работать, поэтому я использовал log4jdbc для перехвата операторов JDBC, он очень прост в использовании и предоставляет больше информации, чем p6spy:

Просто выполните два простых шага:

  1. Добавьте ниже две зависимости в свой файл pom или добавьте соответствующие банки в свой путь к классам:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>org.lazyluke</groupId>
        <artifactId>log4jdbc-remix</artifactId>
        <version>0.2.7</version>
    </dependency>
    
  2. Измените свои свойства DB_URL и DB_DRIVER следующим образом, я использовал базу данных h2, поэтому я установил следующие свойства:

    DB_DRIVER=org.h2.Driver DB_URL=jdbc:h2:./target/db/notificationdb;AUTO_SERVER=TRUE;TRACE_LEVEL_FILE=0;MODE=Oracle;

    Поэтому я изменил их как:

    DB_DRIVER=net.sf.log4jdbc.DriverSpy DB_URL=jdbc:log4jdbc:h2:./target/db/notificationdb;AUTO_SERVER=TRUE;TRACE_LEVEL_FILE=0;MODE=Oracl;

И это был мой файл log4j.properties:

log4j.rootLogger=INFO, stdout                                               
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n

И все готово, и вы увидите настоящие SQL-запросы и даже их результаты.

person S'chn T'gai Spock    schedule 14.08.2017