Skip to content

Commit 2800373

Browse files
committed
When pool autocommit is disabled, inform Hibernate
Starting with Hibernate 5.2.10, the JPA property `hibernate.connection.provider_disables_autocommit` should be set to true when the datasource has autocommit disabled in order to improve performance. Fixes #9261
1 parent 4c576f6 commit 2800373

File tree

5 files changed

+47
-0
lines changed

5 files changed

+47
-0
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.autoconfigure.orm.jpa;
1818

1919
import java.util.Arrays;
20+
import java.util.Collection;
2021
import java.util.Collections;
2122
import java.util.LinkedHashMap;
2223
import java.util.List;
@@ -40,6 +41,9 @@
4041
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.HibernateEntityManagerCondition;
4142
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
4243
import org.springframework.boot.jdbc.SchemaManagementProvider;
44+
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadata;
45+
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
46+
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProviders;
4347
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
4448
import org.springframework.context.annotation.ConditionContext;
4549
import org.springframework.context.annotation.Conditional;
@@ -73,6 +77,8 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
7377

7478
private static final String JTA_PLATFORM = "hibernate.transaction.jta.platform";
7579

80+
private static final String PROVIDER_DISABLES_AUTOCOMMIT = "hibernate.connection.provider_disables_autocommit";
81+
7682
/**
7783
* {@code NoJtaPlatform} implementations for various Hibernate versions.
7884
*/
@@ -89,16 +95,19 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
8995
"org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform", };
9096

9197
private final HibernateDefaultDdlAutoProvider defaultDdlAutoProvider;
98+
private final Collection<DataSourcePoolMetadataProvider> metadataProviders;
9299

93100
public HibernateJpaAutoConfiguration(DataSource dataSource,
94101
JpaProperties jpaProperties,
95102
ObjectProvider<JtaTransactionManager> jtaTransactionManager,
96103
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers,
104+
ObjectProvider<Collection<DataSourcePoolMetadataProvider>> metadataProviders,
97105
ObjectProvider<List<SchemaManagementProvider>> providers) {
98106
super(dataSource, jpaProperties, jtaTransactionManager,
99107
transactionManagerCustomizers);
100108
this.defaultDdlAutoProvider = new HibernateDefaultDdlAutoProvider(
101109
providers.getIfAvailable(Collections::emptyList));
110+
this.metadataProviders = metadataProviders.getIfAvailable();
102111
}
103112

104113
@Override
@@ -121,6 +130,9 @@ protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
121130
if (!vendorProperties.containsKey(JTA_PLATFORM)) {
122131
configureJtaPlatform(vendorProperties);
123132
}
133+
if (!vendorProperties.containsKey(PROVIDER_DISABLES_AUTOCOMMIT)) {
134+
configureProviderDisablesAutocommit(vendorProperties);
135+
}
124136
}
125137

126138
private void configureJtaPlatform(Map<String, Object> vendorProperties)
@@ -142,6 +154,18 @@ private void configureJtaPlatform(Map<String, Object> vendorProperties)
142154
}
143155
}
144156

157+
private void configureProviderDisablesAutocommit(Map<String, Object> vendorProperties) {
158+
DataSourcePoolMetadataProvider poolMetadataProvider = new DataSourcePoolMetadataProviders(
159+
this.metadataProviders);
160+
DataSourcePoolMetadata poolMetadata = poolMetadataProvider
161+
.getDataSourcePoolMetadata(getDataSource());
162+
if (poolMetadata != null
163+
&& Boolean.FALSE.equals(poolMetadata.getDefaultAutoCommit())
164+
&& getJtaTransactionManager() == null) {
165+
vendorProperties.put(PROVIDER_DISABLES_AUTOCOMMIT, "true");
166+
}
167+
}
168+
145169
private boolean runningOnWebSphere() {
146170
return ClassUtils.isPresent(
147171
"com.ibm.websphere.jtaextensions." + "ExtendedJTATransaction",

spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/CommonsDbcp2DataSourcePoolMetadata.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,9 @@ public String getValidationQuery() {
5353
return getDataSource().getValidationQuery();
5454
}
5555

56+
@Override
57+
public Boolean getDefaultAutoCommit() {
58+
return getDataSource().getDefaultAutoCommit();
59+
}
60+
5661
}

spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/DataSourcePoolMetadata.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,12 @@ public interface DataSourcePoolMetadata {
7171
*/
7272
String getValidationQuery();
7373

74+
/**
75+
* The default auto-commit state of connections created by this pool.
76+
* If not set ({@code null}), default is JDBC driver default
77+
* (If set to null then the java.sql.Connection.setAutoCommit(boolean) method will not be called.)
78+
* @return the default auto-commit state or {@code null}
79+
*/
80+
Boolean getDefaultAutoCommit();
81+
7482
}

spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/HikariDataSourcePoolMetadata.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,9 @@ public String getValidationQuery() {
6666
return getDataSource().getConnectionTestQuery();
6767
}
6868

69+
@Override
70+
public Boolean getDefaultAutoCommit() {
71+
return getDataSource().isAutoCommit();
72+
}
73+
6974
}

spring-boot/src/main/java/org/springframework/boot/jdbc/metadata/TomcatDataSourcePoolMetadata.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,9 @@ public String getValidationQuery() {
5353
return getDataSource().getValidationQuery();
5454
}
5555

56+
@Override
57+
public Boolean getDefaultAutoCommit() {
58+
return getDataSource().isDefaultAutoCommit();
59+
}
60+
5661
}

0 commit comments

Comments
 (0)