谢谢你,你的建议对我有帮助。但是仍然有一个我还没有理解的问题。为了记录 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 个变体:
- 如果我在“modulelist”属性中设置“com.p6spy.engine.outage.P6OutageFactory”,我必须创建额外的类来创建 P6LogOptions 实例。
- 如果我在“modulelist”属性中设置“com.p6spy.engine.outage.P6OutageFactory”,我还必须在“modulelist”属性中设置一个 P6LogFactory 值并将“excludecategories”属性设置为“信息、调试、结果、结果集、批处理、提交,statement' 仅用于过滤中断语句。