0

我正在尝试使用 p6spy 记录中断 sql 语句。基于官方文档(http://p6spy.readthedocs.io/en/latest/index.html),我可以通过在 spy.properties 文件中设置特定属性来做到这一点,例如 outagedetection 和 outagedetectioninterval。我在'true'中设置了outagedetection值,在'1'中设置了outagedetectioninterval,我认为我在我的结果spy.log文件中只看到了执行时间超过1秒的语句,但我得到了意想不到的结果:( - 我看到了所有的sql -statement 尽管我已经设置了outage-properties。有人遇到过这样的问题吗?

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

  1. 在 pom.xml 中添加依赖 在 此处输入图像描述

  2. 在 p6spy 的官方文档(http://p6spy.readthedocs.io/en/latest/configandusage.html#common-property-file-settings)中,我得到了 spy.property,只留下了我需要的属性。下面代码中的结果(为了便于阅读,我删除了一些注释行): 在此处输入图像描述

  3. 改变了我的 application.yml 下一个方式:

    • 在 jdbc 之后更改 url 和 app :p6spy 后缀。
    • 设置 driverClassName 属性。以下代码中的结果: 在此处输入图像描述
4

2 回答 2

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
    };
}

}

在我看来,这样的行为有点奇怪。我想在不创建其他类的情况下使用具有 'com.p6spy.engine.outage.P6OutageFactory' 值的 'modulelist' 属性。

为了正确使用 p6spy lib,我发现了 2 个变体:

  1. 如果我在“modulelist”属性中设置“com.p6spy.engine.outage.P6OutageFactory”,我必须创建额外的类来创建 P6LogOptions 实例。
  2. 如果我在“modulelist”属性中设置“com.p6spy.engine.outage.P6OutageFactory”,我还必须在“modulelist”属性中设置一个 P6LogFactory 值并将“excludecategories”属性设置为“信息、调试、结果、结果集、批处理、提交,statement' 仅用于过滤中断语句。
于 2018-08-06T14:21:29.003 回答
0

您需要com.p6spy.engine.logging.P6LogFactorymodulelist财产中移除。

此外,为了更轻松的配置,您可以使用我为与 spring-boot 集成而创建的库。对于大多数spy.properties使用application.yml.

于 2018-07-25T08:54:17.270 回答