p6spy выводит сообщения sql дважды при весенней загрузке - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу показывать параметры sql через p6spy при весенней загрузке, потому что hibernate показывает параметры sql довольно громоздко.Но по какой-то причине p6spy logger выводит сообщение sql дважды, хотя на самом деле запросы к базе данных выполняются один раз.Обычное весеннее приложение работает с моей конфигурацией 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 - time 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)

Как видите, эти выходы похожи, за исключением соединения (2 и 5)

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Принятый ответ не является правильным - Spring Boot не создает автоматически обертку для DataSource.Но у p6spy есть 2 способа перехвата :

Оберните ваш DataSource с помощью P6DataSource или измените URL-адрес вашего соединения, добавив 'p6spy:'.

youне следует использовать оба.

0 голосов
/ 11 февраля 2019

Оказывается, что весенняя загрузка автоматически создает оболочку для p6spy, поэтому эта проблема решена заменой строки

return new P6DataSource(dataSource)

на строку

return dataSourse;
...