Spring Boot 应用程序属性文件中的 hibernate.generate_statistics 是什么意思?

6

在遵循各种示例和阅读spring boot文档后,我仍然无法启用Hibernate统计信息。 我在application.properties文件中设置了属性。 通过集成测试或Application.java运行spring boot应用程序不会生成任何统计信息。

我的application.properties文件如下。

    spring.datasource.jdbcUrl=jdbc:postgresql://localhost:5432/postgres
    spring.datasource.username = postgres
    spring.datasource.password = password

    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.datasource.platform=postgres

    spring.datasource.testWhileIdle = true
    spring.datasource.validationQuery = SELECT 1

    spring.jpa.properties.hibernate.show_sql=true
    spring.jpa.properties.hibernate.format_sql=true
    spring.jpa.properties.hibernate.generate_statistics=true

    logging.level.org.hibernate.SQL=TRACE
    logging.level.org.hibernate.stat=TRACE

    logging.file=transaction-app.log

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

我的集成测试

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SqlMappingTest {

    @Autowired
    PlanService planService;

    @org.junit.Test
    public void findAll() {
        List<Plan> plans = planService.findAll();
        Assert.assertEquals(1, plans.size());

    }
}

我错过了什么?

4个回答

18

它适用于我(使用Spring Boot 2.1.6.RELEASE)。

a)在application.properties文件中:

spring.jpa.properties.hibernate.generate_statistics=true
b) 确保'org.hibernate.stat'的运行时调试级别至少为DEBUG:
curl -i -X POST -H 'Content-Type: application/json' -d '{"configuredLevel": "DEBUG"}' http://localhost:8080/actuator/loggers/org.hibernate.stat

c) 检查日志,查找类似以下内容的记录:

2019-07-03 21:27:27.739 DEBUG 11797 --- [nio-8080-exec-3] o.h.stat.internal.StatisticsImpl         : HHH000117: HQL: select count(*) from AppRequest x WHERE x.uuid = :uuid, time: 1ms, rows: 1    

嘿,谢谢你的帮助。在我意识到我需要在app.properties文件中添加spring.jpa.properties.hibernate.generate_statistics而不仅仅是hibernate.generate_statistics之前,我看了半打的答案。 - Alex Pritchard

6

不确定下面的代码是否正确,但我已经使其可用。 我正在构建过程中将属性强制添加到我的LocalContainerEntityManagerFactoryBean中。

DatabaseConfig片段:

    @Configuration
    @EnableTransactionManagement
    @ConfigurationProperties(prefix = "spring.datasource")
    public class DatabaseConfig extends HikariConfig {

        @Autowired
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, Environment env) {
            LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

            entityManagerFactory.setDataSource(dataSource);

            // Classpath scanning of @Component, @Service, etc annotated class
            entityManagerFactory.setPackagesToScan(new String[]{"com.test"});

            // Vendor adapter
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            entityManagerFactory.setJpaVendorAdapter(vendorAdapter);

            Properties jpaProperties = new Properties();

            jpaProperties.put("hibernate.show_sql",
                    env.getRequiredProperty("spring.jpa.properties.hibernate.show_sql")
            );

            jpaProperties.put("hibernate.format_sql",
                    env.getRequiredProperty("spring.jpa.properties.hibernate.format_sql")
            );
            jpaProperties.put("hibernate.generate_statistics",
                    env.getRequiredProperty("spring.jpa.properties.hibernate.generate_statistics")
            );

            entityManagerFactory.setJpaProperties(jpaProperties);
            return entityManagerFactory;
        }
    }

配置完成后

2017-03-16 11:41:02.881 DEBUG 7884 --- [main] o.h.s.internal.ConcurrentStatisticsImpl  : HHH000117: HQL: select up from UserPlan up, time: 48ms, rows: 1
2017-03-16 11:41:02.885  INFO 7884 --- [main] i.StatisticalLoggingSessionEventListener : Session Metrics {
    939077 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    2848386 nanoseconds spent preparing 1 JDBC statements;
    12205063 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    18693 nanoseconds spent executing 1 partial-flushes (flushing a total of 0 entities and 0 collections)
}

为了完整性,所有影响Hibernate的不同来源的设置都可以通过类路径“org.hibernate.cfg.Environment”访问。 - Patronaut

2
在hibernate.properties文件中定义属性hibernate.generate_statistics=true。"Original Answer"翻译成"最初的回答"。

1

对我来说,使用 -Dhibernate.generate_statistics=true 运行应用程序就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接