首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >p6spy用spring引导两次输出sql消息。

p6spy用spring引导两次输出sql消息。
EN

Stack Overflow用户
提问于 2019-02-11 09:39:27
回答 2查看 2.3K关注 0票数 3

我想在春季启动时通过p6spy显示sql参数,因为hibernate显示的sql参数相当庞大。但出于某种原因,p6spy记录器输出了两次sql消息,尽管实际上只对数据库执行一次查询。通常的spring应用程序通常与我的p6spy配置一起工作。Spring引导应用程序通常与hibernate输出一起工作。

spy.properties:

代码语言:javascript
复制
driverlist=org.postgresql.Driver
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=time %(executionTime)|con %(connectionId)|%(sqlSingleLine)

log4j2.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="layoutPattern">
            %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
        </Property>
    </Properties>

<Appenders>
    <Console name="stdout">
        <PatternLayout pattern="${layoutPattern}"/>
    </Console>


</Appenders>

<Loggers>
    <Root level="info">
        <AppenderRef ref="stdout" />
    </Root>
</Loggers>

</Configuration>

HibernateConfig:

代码语言:javascript
复制
@Configuration
@EnableTransactionManagement
public class HibernateConfig {

@Bean
public LocalSessionFactoryBean getSessionFactory(){

    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setPackagesToScan("bel.rdigital.p6spy.boot.test.model");

    Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty(DIALECT, "org.hibernate.dialect.PostgreSQLDialect");
    hibernateProperties.setProperty(HBM2DDL_AUTO, "create");
    hibernateProperties.setProperty(SHOW_SQL, "true");

    sessionFactory.setDataSource(dataSource());
    sessionFactory.setHibernateProperties(hibernateProperties);

    return sessionFactory;
}

@Bean
public DataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.p6spy.engine.spy.P6SpyDriver");
    dataSource.setUrl("jdbc:p6spy:postgresql://localhost:5432/p6spy");
    dataSource.setUsername("postgres");
    dataSource.setPassword("postgres");
    return new P6DataSource(dataSource);
}

@Bean
public HibernateTransactionManager getTransactionManager() {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(getSessionFactory().getObject());
    return transactionManager;
}

}

我期望有一个sql输出,但得到两个具有不同p6spy连接的类似sql输出:

1) p6spy -在服务器初创企业(applicationName、hostName、ip、startDate、stopDate、startupId)值(‘,’Dimon-膝上型计算机‘,'192.168.88.244','2019-02-11T12:00:46.989+0300',NULL,1)中插入时间为1

2) p6spy -在服务器初创企业(applicationName、hostName、ip、startDate、stopDate、startupId)值(‘,’Dimon-膝上型计算机‘,'192.168.88.244','2019-02-11T12:00:46.989+0300',NULL,1)中插入时间为1

如您所见,除了连接(2和5)之外,这些输出都是相似的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-07 19:08:46

Spring不会自动为DataSource创建包装器。但是p6spy有2种拦截方式

用DataSource包装P6DataSource或修改连接URL以添加‘p6间谍:’。

你不应该两者兼用。

票数 5
EN

Stack Overflow用户

发布于 2019-02-11 14:49:49

结果表明,spring引导自动为p6spy创建包装器,因此这个问题得到了解决,可以替换行

代码语言:javascript
复制
return new P6DataSource(dataSource)

在线

代码语言:javascript
复制
return dataSourse;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54627574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档