P6Spy. Как обнаружить отключение?
Я пытаюсь использовать p6spy для входа в систему отключения SQL-заявление. Основываясь на официальном документе ( http://p6spy.readthedocs.io/en/latest/index.html), я могу сделать это, установив определенные свойства в файле spy.properties, такие как outagedetection и outagedetectioninterval. Я установил значение outagedetection в 'true', а интервал outagedetection в '1', и я подумал, что я видел только операторы со временем выполнения более 1 секунды в моем файле spy.log результатов, но я получил неожиданный результат:( - Я видел все sql-это заявление, несмотря на то, что я установил свойства отключения. Кто-нибудь сталкивался с такой проблемой?
Мы используем hibernate 5 + пружинный ботинок + h2 db + maven. Для использования p6spy я сделал следующую конфигурацию.
Добавить зависимость в pom.xml введите описание изображения здесь
В официальном документе p6spy ( http://p6spy.readthedocs.io/en/latest/configandusage.html) я получил spy.property и оставляю только нужные мне свойства. Результат в коде ниже (я удалил некоторые закомментированные строки для удобства чтения): введите описание изображения здесь
Изменил мой application.yml следующим образом:
- измените URL и приложение: постфикс p6spy после jdbc.
- установить свойство driverClassName. Результат в коде ниже: введите описание изображения здесь
2 ответа
Вы должны удалить com.p6spy.engine.logging.P6LogFactory
от modulelist
имущество.
Также для упрощения настройки вы можете использовать мою библиотеку, которую я создал для интеграции с spring-boot. Это позволяет более простую настройку для большинства spy.properties
с помощью application.yml
,
Спасибо, ваш совет помог мне. Но все же есть проблема, которую я еще не понял. Для записи sql-оператора у меня должен быть экземпляр P6LogOptions.class. Если я устанавливаю com.p6spy.engine.logging.P6LogFactory в качестве значения свойства modulelist, экземпляр класса P6LogOptions.class создается в переопределенном методе getOptions (...) (этот метод объявлен в интерфейсе P6Factory)., В случае 'com.p6spy.engine.outage.P6OutageFactory' в качестве значения свойства 'modulelist' у нас нет экземпляра P6LogOptions.class, и в этом случае я столкнулся с исключением NPE.
Exception in thread "P6SpyOutageThread" java.lang.NullPointerException
at com.p6spy.engine.common.P6LogQuery.isLoggable(P6LogQuery.java:148)
at com.p6spy.engine.common.P6LogQuery.logElapsed(P6LogQuery.java:188)
at com.p6spy.engine.outage.P6OutageDetector.logOutage(P6OutageDetector.java:142)
at com.p6spy.engine.outage.P6OutageDetector.detectOutage(P6OutageDetector.java:136)
at com.p6spy.engine.outage.P6OutageDetector.run(P6OutageDetector.java:78)
at java.lang.Thread.run(Thread.java:748)
Я разрешил это исключение, создав в своем проекте еще одну фабрику, которая реализует P6Factory.class. Код нового класса ниже:
public class LogFactory implements P6Factory {
@Override
public P6LoadableOptions getOptions(P6OptionsRepository optionsRepository) {
return new P6LogOptions(optionsRepository);
}
@Override
public JdbcEventListener getJdbcEventListener() {
return new JdbcEventListener() {
// NOOP
};
}
}
На мой взгляд, такое поведение немного странно. Я предполагаю использовать свойство 'modulelist' со значением 'com.p6spy.engine.outage.P6OutageFactory' без создания дополнительных классов.
Для правильного использования p6spy lib я нашел 2 варианта:
- если я устанавливаю com.p6spy.engine.outage.P6OutageFactory в свойстве modulelist, я должен создать дополнительный класс, который создает экземпляр P6LogOptions.
- если я устанавливаю 'com.p6spy.engine.outage.P6OutageFactory' в свойстве 'modulelist', я также должен установить значение P6LogFactory в свойстве 'modulelist' и установить свойство 'excludecategories' в качестве 'info,debug,result,resultset,batch,commit, Statement 'только для фильтрации операторов.