p6spy выводит сообщения sql дважды при весенней загрузке
Я хочу показать параметры 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 - время 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).
1 ответ
Оказывается, весенняя загрузка автоматически создает оболочку для p6spy, поэтому эта проблема решается заменой строки
return new P6DataSource(dataSource)
онлайн
return dataSourse;
Принятый ответ не является правильным - Spring Boot не создает автоматически обертку для DataSource. Но у p6spy есть 2 способа перехвата:
Оберните ваш DataSource P6DataSource или измените URL вашего соединения, добавив "p6spy:".
Вы не должны использовать оба.