gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:43:19 25 4
gpt4 key购买 nike

我想在 spring boot 中通过 p6spy 显示 sql 参数,因为 hibernate 显示的 sql 参数非常庞大。但是由于某种原因,p6spy 记录器输出了两次 sql 消息,尽管实际上对数据库的查询执行了一次。通常的 spring 应用程序可以正常使用我的 p6spy 配置。 Spring Boot 应用程序可以正常使用 hibernate 输出。

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>

hibernate 配置:

@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 - time 1|con 2|insert into serverstartups (applicationName, hostName, ip, startDate, stopDate, startupId) values ('', '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 不会自动为 DataSource 创建包装器。但是 p6spy 有 2 ways to intercept :

Wrap your DataSource with P6DataSource or modify your connection URLto add ‘p6spy:’.

你不应该同时使用两者。

关于java - p6spy 使用 spring boot 两次输出 sql 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54627574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com