p6spy使用spring boot两次输出sql消息

时间:2019-02-11 09:39:27

标签: java hibernate spring-boot p6spy

我想在春季启动时通过p6spy显示sql参数,因为hibernate显示的SQL参数相当庞大。但是由于某种原因,p6spy logger两次输出sql消息,尽管实际上对数据库的查询执行一次。通常的spring应用程序可以正常使用我的p6spy配置。 Spring Boot应用程序可以正常使用休眠输出。

spy.properties:

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:

<?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:

@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输出,但是得到两个类似的sql输出,但具有不同的p6spy连接:

1)p6spy-时间1 | con 2 |插入服务器启动程序(applicationName,hostName,ip,startDate,stopDate,startupId)值('','DIMON-LAPTOP','192.168.88.244','2019-02 -11T12:00:46.989 + 0300',NULL,1)

2)p6spy-时间1 | con 5 |插入服务器启动程序(applicationName,hostName,ip,startDate,stopDate,startupId)值('','DIMON-LAPTOP','192.168.88.244','2019-02 -11T12:00:46.989 + 0300',NULL,1)

如您所见,除了connection(2和5)以外,这些输出都是相似的

2 个答案:

答案 0 :(得分:0)

事实证明,Spring Boot会自动为p6spy创建包装器,因此替换行即可解决此问题

return new P6DataSource(dataSource)

在线

return dataSourse;

答案 1 :(得分:0)

接受的答案实际上并不正确-Spring Boot不会自动为DataSource创建包装器。但是p6spy具有2 ways to intercept

  

使用P6DataSource包裹您的DataSource或修改您的连接URL   添加“ p6spy:”。

您不应同时使用两者。