Skip to content

Commit 9efff2a

Browse files
committed
Merge branch '2.3.x'
Closes gh-23735
2 parents 3898498 + f4e822f commit 9efff2a

File tree

6 files changed

+46
-5
lines changed

6 files changed

+46
-5
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfiguration.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2019 the original author or authors.
2+
* Copyright 2012-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
2626
import io.micrometer.core.instrument.binder.jpa.HibernateMetrics;
2727
import org.hibernate.SessionFactory;
2828

29-
import org.springframework.beans.factory.annotation.Autowired;
29+
import org.springframework.beans.factory.SmartInitializingSingleton;
3030
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
3131
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
3232
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -50,11 +50,25 @@
5050
SimpleMetricsExportAutoConfiguration.class })
5151
@ConditionalOnClass({ EntityManagerFactory.class, SessionFactory.class, MeterRegistry.class })
5252
@ConditionalOnBean({ EntityManagerFactory.class, MeterRegistry.class })
53-
public class HibernateMetricsAutoConfiguration {
53+
public class HibernateMetricsAutoConfiguration implements SmartInitializingSingleton {
5454

5555
private static final String ENTITY_MANAGER_FACTORY_SUFFIX = "entityManagerFactory";
5656

57-
@Autowired
57+
private final Map<String, EntityManagerFactory> entityManagerFactories;
58+
59+
private final MeterRegistry meterRegistry;
60+
61+
public HibernateMetricsAutoConfiguration(Map<String, EntityManagerFactory> entityManagerFactories,
62+
MeterRegistry meterRegistry) {
63+
this.entityManagerFactories = entityManagerFactories;
64+
this.meterRegistry = meterRegistry;
65+
}
66+
67+
@Override
68+
public void afterSingletonsInstantiated() {
69+
bindEntityManagerFactoriesToRegistry(this.entityManagerFactories, this.meterRegistry);
70+
}
71+
5872
public void bindEntityManagerFactoriesToRegistry(Map<String, EntityManagerFactory> entityManagerFactories,
5973
MeterRegistry registry) {
6074
entityManagerFactories.forEach((name, factory) -> bindEntityManagerFactoryToRegistry(name, factory, registry));

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfigurationTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,16 @@
3535
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
3636
import org.springframework.boot.autoconfigure.AutoConfigurations;
3737
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
38+
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilderCustomizer;
3839
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
3940
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
4041
import org.springframework.boot.test.context.FilteredClassLoader;
4142
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
4243
import org.springframework.context.annotation.Bean;
4344
import org.springframework.context.annotation.Configuration;
4445
import org.springframework.context.annotation.Primary;
46+
import org.springframework.core.task.SimpleAsyncTaskExecutor;
47+
import org.springframework.jdbc.core.JdbcTemplate;
4548
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
4649
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
4750

@@ -127,6 +130,21 @@ void entityManagerFactoryInstrumentationIsDisabledIfHibernateIsNotAvailable() {
127130
});
128131
}
129132

133+
@Test
134+
void entityManagerFactoryInstrumentationDoesNotDeadlockWithDeferredInitialization() {
135+
this.contextRunner
136+
.withPropertyValues("spring.jpa.properties.hibernate.generate_statistics:true",
137+
"spring.datasource.schema=city-schema.sql", "spring.datasource.data=city-data.sql")
138+
.withBean(EntityManagerFactoryBuilderCustomizer.class,
139+
() -> (builder) -> builder.setBootstrapExecutor(new SimpleAsyncTaskExecutor()))
140+
.run((context) -> {
141+
JdbcTemplate jdbcTemplate = new JdbcTemplate(context.getBean(DataSource.class));
142+
assertThat(jdbcTemplate.queryForObject("SELECT COUNT(*) from CITY", Integer.class)).isEqualTo(1);
143+
MeterRegistry registry = context.getBean(MeterRegistry.class);
144+
registry.get("hibernate.statements").tags("entityManagerFactory", "entityManagerFactory").meter();
145+
});
146+
}
147+
130148
@Configuration(proxyBeanMethods = false)
131149
static class BaseConfiguration {
132150

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
INSERT INTO CITY (ID, NAME, STATE, COUNTRY, MAP) values (2000, 'Washington', 'DC', 'US', 'Google');
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CREATE TABLE CITY (
2+
id INTEGER IDENTITY PRIMARY KEY,
3+
name VARCHAR(30),
4+
state VARCHAR(30),
5+
country VARCHAR(30),
6+
map VARCHAR(30)
7+
);

spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ description = "Spring Boot Data JPA smoke test"
88
dependencies {
99
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa"))
1010
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-web"))
11+
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-actuator"))
1112

1213
runtimeOnly("com.h2database:h2")
1314

Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
spring.h2.console.enabled=true
22
spring.jpa.open-in-view=true
3-
spring.data.jpa.repositories.bootstrap-mode=default
3+
spring.data.jpa.repositories.bootstrap-mode=deferred
44
logging.level.org.hibernate.SQL=debug

0 commit comments

Comments
 (0)