p6spy 在 spring 引导时输出 sql 消息两次
p6spy outputs sql messages twice with spring boot
我想在 spring 启动时通过 p6spy 显示 sql 参数,因为休眠显示的 sql 参数非常庞大。但由于某种原因,p6spy 记录器输出 sql 消息两次,尽管实际上对数据库的查询执行一次。通常的 spring 应用程序可以正常使用我的 p6spy 配置。 Spring 启动应用程序可以正常使用休眠输出。
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>
休眠配置:
@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|insert into serverstartups (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|插入 serverstartups (applicationName, hostName, ip, startDate, stopDate, startupId) values ('', 'DIMON-LAPTOP', '192.168.88.244', '2019 -02-11T12:00:46.989+0300', NULL, 1)
如您所见,除了连接(2 和 5)之外,这些输出是相似的
事实证明 spring boot 自动为 p6spy 创建包装器,所以这个问题解决了替换行
return new P6DataSource(dataSource)
在线
return dataSourse;
Spring 启动不会自动为数据源创建包装器。但是 p6spy 有 2 ways to intercept:
Wrap your DataSource with P6DataSource or modify your connection URL
to add ‘p6spy:’.
你不应该同时使用两者。
我想在 spring 启动时通过 p6spy 显示 sql 参数,因为休眠显示的 sql 参数非常庞大。但由于某种原因,p6spy 记录器输出 sql 消息两次,尽管实际上对数据库的查询执行一次。通常的 spring 应用程序可以正常使用我的 p6spy 配置。 Spring 启动应用程序可以正常使用休眠输出。
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>
休眠配置:
@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|insert into serverstartups (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|插入 serverstartups (applicationName, hostName, ip, startDate, stopDate, startupId) values ('', 'DIMON-LAPTOP', '192.168.88.244', '2019 -02-11T12:00:46.989+0300', NULL, 1)
如您所见,除了连接(2 和 5)之外,这些输出是相似的
事实证明 spring boot 自动为 p6spy 创建包装器,所以这个问题解决了替换行
return new P6DataSource(dataSource)
在线
return dataSourse;
Spring 启动不会自动为数据源创建包装器。但是 p6spy 有 2 ways to intercept:
Wrap your DataSource with P6DataSource or modify your connection URL to add ‘p6spy:’.
你不应该同时使用两者。