Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
b7a8b0f1
Commit
b7a8b0f1
authored
Oct 20, 2020
by
Stephane Nicoll
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Hacking
See gh-23740
parent
633027b1
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
45 additions
and
3 deletions
+45
-3
HibernateMetricsAutoConfiguration.java
...re/metrics/orm/jpa/HibernateMetricsAutoConfiguration.java
+16
-1
HibernateMetricsAutoConfigurationTests.java
...trics/orm/jpa/HibernateMetricsAutoConfigurationTests.java
+19
-1
city-data.sql
...t-actuator-autoconfigure/src/test/resources/city-data.sql
+1
-0
city-schema.sql
...actuator-autoconfigure/src/test/resources/city-schema.sql
+7
-0
build.gradle
...-smoke-tests/spring-boot-smoke-test-data-jpa/build.gradle
+1
-0
application.properties
...e-test-data-jpa/src/main/resources/application.properties
+1
-1
No files found.
spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfiguration.java
View file @
b7a8b0f1
...
@@ -26,6 +26,7 @@ import io.micrometer.core.instrument.MeterRegistry;
...
@@ -26,6 +26,7 @@ import io.micrometer.core.instrument.MeterRegistry;
import
io.micrometer.core.instrument.binder.jpa.HibernateMetrics
;
import
io.micrometer.core.instrument.binder.jpa.HibernateMetrics
;
import
org.hibernate.SessionFactory
;
import
org.hibernate.SessionFactory
;
import
org.springframework.beans.factory.SmartInitializingSingleton
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration
;
import
org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration
;
import
org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration
;
import
org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration
;
...
@@ -50,11 +51,25 @@ import org.springframework.util.StringUtils;
...
@@ -50,11 +51,25 @@ import org.springframework.util.StringUtils;
SimpleMetricsExportAutoConfiguration
.
class
})
SimpleMetricsExportAutoConfiguration
.
class
})
@ConditionalOnClass
({
EntityManagerFactory
.
class
,
SessionFactory
.
class
,
MeterRegistry
.
class
})
@ConditionalOnClass
({
EntityManagerFactory
.
class
,
SessionFactory
.
class
,
MeterRegistry
.
class
})
@ConditionalOnBean
({
EntityManagerFactory
.
class
,
MeterRegistry
.
class
})
@ConditionalOnBean
({
EntityManagerFactory
.
class
,
MeterRegistry
.
class
})
public
class
HibernateMetricsAutoConfiguration
{
public
class
HibernateMetricsAutoConfiguration
implements
SmartInitializingSingleton
{
private
static
final
String
ENTITY_MANAGER_FACTORY_SUFFIX
=
"entityManagerFactory"
;
private
static
final
String
ENTITY_MANAGER_FACTORY_SUFFIX
=
"entityManagerFactory"
;
private
Map
<
String
,
EntityManagerFactory
>
entityManagerFactories
;
private
MeterRegistry
meterRegistry
;
@Autowired
@Autowired
void
injectDependencies
(
Map
<
String
,
EntityManagerFactory
>
entityManagerFactories
,
MeterRegistry
meterRegistry
)
{
this
.
entityManagerFactories
=
entityManagerFactories
;
this
.
meterRegistry
=
meterRegistry
;
}
@Override
public
void
afterSingletonsInstantiated
()
{
bindEntityManagerFactoriesToRegistry
(
this
.
entityManagerFactories
,
this
.
meterRegistry
);
}
public
void
bindEntityManagerFactoriesToRegistry
(
Map
<
String
,
EntityManagerFactory
>
entityManagerFactories
,
public
void
bindEntityManagerFactoriesToRegistry
(
Map
<
String
,
EntityManagerFactory
>
entityManagerFactories
,
MeterRegistry
registry
)
{
MeterRegistry
registry
)
{
entityManagerFactories
.
forEach
((
name
,
factory
)
->
bindEntityManagerFactoryToRegistry
(
name
,
factory
,
registry
));
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
View file @
b7a8b0f1
...
@@ -35,6 +35,7 @@ import org.mockito.ArgumentMatchers;
...
@@ -35,6 +35,7 @@ import org.mockito.ArgumentMatchers;
import
org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun
;
import
org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun
;
import
org.springframework.boot.autoconfigure.AutoConfigurations
;
import
org.springframework.boot.autoconfigure.AutoConfigurations
;
import
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
;
import
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
;
import
org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilderCustomizer
;
import
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
;
import
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
;
import
org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder
;
import
org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder
;
import
org.springframework.boot.test.context.FilteredClassLoader
;
import
org.springframework.boot.test.context.FilteredClassLoader
;
...
@@ -42,6 +43,8 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner;
...
@@ -42,6 +43,8 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.core.task.SimpleAsyncTaskExecutor
;
import
org.springframework.jdbc.core.JdbcTemplate
;
import
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
;
import
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
;
import
org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter
;
import
org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter
;
...
@@ -58,7 +61,7 @@ import static org.mockito.Mockito.mock;
...
@@ -58,7 +61,7 @@ import static org.mockito.Mockito.mock;
*/
*/
class
HibernateMetricsAutoConfigurationTests
{
class
HibernateMetricsAutoConfigurationTests
{
private
ApplicationContextRunner
contextRunner
=
new
ApplicationContextRunner
().
with
(
MetricsRun
.
simple
())
private
final
ApplicationContextRunner
contextRunner
=
new
ApplicationContextRunner
().
with
(
MetricsRun
.
simple
())
.
withConfiguration
(
AutoConfigurations
.
of
(
DataSourceAutoConfiguration
.
class
,
.
withConfiguration
(
AutoConfigurations
.
of
(
DataSourceAutoConfiguration
.
class
,
HibernateJpaAutoConfiguration
.
class
,
HibernateMetricsAutoConfiguration
.
class
))
HibernateJpaAutoConfiguration
.
class
,
HibernateMetricsAutoConfiguration
.
class
))
.
withUserConfiguration
(
BaseConfiguration
.
class
);
.
withUserConfiguration
(
BaseConfiguration
.
class
);
...
@@ -127,6 +130,21 @@ class HibernateMetricsAutoConfigurationTests {
...
@@ -127,6 +130,21 @@ class HibernateMetricsAutoConfigurationTests {
});
});
}
}
@Test
void
entityManagerFactoryInstrumentationDoesNotDeadlockWithDeferredInitialization
()
{
this
.
contextRunner
.
withPropertyValues
(
"spring.jpa.properties.hibernate.generate_statistics:true"
,
"spring.datasource.schema=city-schema.sql"
,
"spring.datasource.data=city-data.sql"
)
.
withBean
(
EntityManagerFactoryBuilderCustomizer
.
class
,
()
->
(
builder
)
->
builder
.
setBootstrapExecutor
(
new
SimpleAsyncTaskExecutor
()))
.
run
((
context
)
->
{
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
context
.
getBean
(
DataSource
.
class
));
assertThat
(
jdbcTemplate
.
queryForObject
(
"SELECT COUNT(*) from CITY"
,
Integer
.
class
)).
isEqualTo
(
1
);
MeterRegistry
registry
=
context
.
getBean
(
MeterRegistry
.
class
);
registry
.
get
(
"hibernate.statements"
).
tags
(
"entityManagerFactory"
,
"entityManagerFactory"
).
meter
();
});
}
@Configuration
(
proxyBeanMethods
=
false
)
@Configuration
(
proxyBeanMethods
=
false
)
static
class
BaseConfiguration
{
static
class
BaseConfiguration
{
...
...
spring-boot-project/spring-boot-actuator-autoconfigure/src/test/resources/city-data.sql
0 → 100644
View file @
b7a8b0f1
INSERT
INTO
CITY
(
ID
,
NAME
,
STATE
,
COUNTRY
,
MAP
)
values
(
2000
,
'Washington'
,
'DC'
,
'US'
,
'Google'
);
spring-boot-project/spring-boot-actuator-autoconfigure/src/test/resources/city-schema.sql
0 → 100644
View file @
b7a8b0f1
CREATE
TABLE
CITY
(
id
INTEGER
IDENTITY
PRIMARY
KEY
,
name
VARCHAR
(
30
),
state
VARCHAR
(
30
),
country
VARCHAR
(
30
),
map
VARCHAR
(
30
)
);
spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/build.gradle
View file @
b7a8b0f1
...
@@ -8,6 +8,7 @@ description = "Spring Boot Data JPA smoke test"
...
@@ -8,6 +8,7 @@ description = "Spring Boot Data JPA smoke test"
dependencies
{
dependencies
{
implementation
(
project
(
":spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa"
))
implementation
(
project
(
":spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa"
))
implementation
(
project
(
":spring-boot-project:spring-boot-starters:spring-boot-starter-web"
))
implementation
(
project
(
":spring-boot-project:spring-boot-starters:spring-boot-starter-web"
))
implementation
(
project
(
":spring-boot-project:spring-boot-starters:spring-boot-starter-actuator"
))
runtimeOnly
(
"com.h2database:h2"
)
runtimeOnly
(
"com.h2database:h2"
)
...
...
spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-jpa/src/main/resources/application.properties
View file @
b7a8b0f1
spring.h2.console.enabled
=
true
spring.h2.console.enabled
=
true
spring.jpa.open-in-view
=
true
spring.jpa.open-in-view
=
true
spring.data.jpa.repositories.bootstrap-mode
=
def
ault
spring.data.jpa.repositories.bootstrap-mode
=
def
erred
logging.level.org.hibernate.SQL
=
debug
logging.level.org.hibernate.SQL
=
debug
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment