P6间谍。如何检测停运声明?

时间:2018-07-23 12:23:03

标签: java hibernate p6spy

我正在尝试使用p6spy记录中断的sql语句。根据官方文档(http://p6spy.readthedocs.io/en/latest/index.html),我可以通过在spy.properties文件中设置特定的属性(例如中断检测和中断检测间隔)来实现。我在'true'中设置了outagedetection值,在'1'中设置了outagedetectioninterval,我认为我在结果spy.log文件中仅看到执行时间超过1秒的语句,但是我得到了意外的结果:(-我看到了所有sql尽管设置了断电属性,但仍未声明-有人遇到这样的问题吗?

我们使用hibernate 5 + spring boot + h2 db + maven。对于使用p6spy,我已经完成了以下配置。

  1. 在pom.xml中添加依赖项 enter image description here

  2. 在p6spy(http://p6spy.readthedocs.io/en/latest/configandusage.html#common-property-file-settings)的官方文档中,我得到了spy.property并仅保留了我需要的属性。以下代码中的结果(为了便于阅读,我删除了一些注释行): enter image description here

  3. 以另一种方式更改了我的application.yml:

2 个答案:

答案 0 :(得分:0)

您需要从com.p6spy.engine.logging.P6LogFactory属性中删除modulelist

为了简化配置,您可以使用my library,它是我为与spring-boot集成而创建的。使用spy.properties,可以更轻松地为application.yml中的大多数配置。

答案 1 :(得分:0)

谢谢,您的建议对我有所帮助。但是仍然有一个我还不了解的问题。为了记录sql语句,我必须有一个实例P6LogOptions.class。如果将“ com.p6spy.engine.logging.P6LogFactory”设置为“ modulelist”属性的值,则将在重写的getOptions(...)方法中创建P6LogOptions.class的实例(此方法在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种变体:

  1. 如果我在'modulelist'属性中设置'com.p6spy.engine.outage.P6OutageFactory',则我必须创建其他类来创建P6LogOptions实例。
  2. 如果我在'modulelist'属性中设置'com.p6spy.engine.outage.P6OutageFactory',则我还必须在'modulelist'属性中设置P6LogFactory值,并将'excludecategories'属性设置为'info,debug,result,resultset,批处理,提交,声明”仅用于过滤中断声明。