Skip to content

Commit d0e70e9

Browse files
candrewssnicoll
authored andcommitted
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. See gh-9737
1 parent 70ead01 commit d0e70e9

File tree

5 files changed

+46
-0
lines changed

5 files changed

+46
-0
lines changed

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
3131
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
3232
import org.springframework.boot.jdbc.SchemaManagementProvider;
33+
import org.springframework.boot.jdbc.metadata.CompositeDataSourcePoolMetadataProvider;
34+
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadata;
35+
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
3336
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
3437
import org.springframework.context.annotation.Configuration;
3538
import org.springframework.jndi.JndiLocatorDelegate;
@@ -56,6 +59,8 @@ class HibernateJpaConfiguration extends JpaBaseConfiguration {
5659

5760
private static final String JTA_PLATFORM = "hibernate.transaction.jta.platform";
5861

62+
private static final String PROVIDER_DISABLES_AUTOCOMMIT = "hibernate.connection.provider_disables_autocommit";
63+
5964
/**
6065
* {@code NoJtaPlatform} implementations for various Hibernate versions.
6166
*/
@@ -72,15 +77,18 @@ class HibernateJpaConfiguration extends JpaBaseConfiguration {
7277
"org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform", };
7378

7479
private final HibernateDefaultDdlAutoProvider defaultDdlAutoProvider;
80+
private final Collection<DataSourcePoolMetadataProvider> metadataProviders;
7581

7682
HibernateJpaConfiguration(DataSource dataSource, JpaProperties jpaProperties,
7783
ObjectProvider<JtaTransactionManager> jtaTransactionManager,
7884
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers,
85+
ObjectProvider<Collection<DataSourcePoolMetadataProvider>> metadataProviders,
7986
ObjectProvider<List<SchemaManagementProvider>> providers) {
8087
super(dataSource, jpaProperties, jtaTransactionManager,
8188
transactionManagerCustomizers);
8289
this.defaultDdlAutoProvider = new HibernateDefaultDdlAutoProvider(
8390
providers.getIfAvailable(Collections::emptyList));
91+
this.metadataProviders = metadataProviders.getIfAvailable();
8492
}
8593

8694
@Override
@@ -103,6 +111,9 @@ protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
103111
if (!vendorProperties.containsKey(JTA_PLATFORM)) {
104112
configureJtaPlatform(vendorProperties);
105113
}
114+
if (!vendorProperties.containsKey(PROVIDER_DISABLES_AUTOCOMMIT)) {
115+
configureProviderDisablesAutocommit(vendorProperties);
116+
}
106117
}
107118

108119
private void configureJtaPlatform(Map<String, Object> vendorProperties)
@@ -124,6 +135,18 @@ private void configureJtaPlatform(Map<String, Object> vendorProperties)
124135
}
125136
}
126137

138+
private void configureProviderDisablesAutocommit(Map<String, Object> vendorProperties) {
139+
CompositeDataSourcePoolMetadataProvider poolMetadataProvider = new CompositeDataSourcePoolMetadataProvider(
140+
this.metadataProviders);
141+
DataSourcePoolMetadata poolMetadata = poolMetadataProvider
142+
.getDataSourcePoolMetadata(getDataSource());
143+
if (poolMetadata != null
144+
&& Boolean.FALSE.equals(poolMetadata.getDefaultAutoCommit())
145+
&& getJtaTransactionManager() == null) {
146+
vendorProperties.put(PROVIDER_DISABLES_AUTOCOMMIT, "true");
147+
}
148+
}
149+
127150
private boolean runningOnWebSphere() {
128151
return ClassUtils.isPresent(
129152
"com.ibm.websphere.jtaextensions." + "ExtendedJTATransaction",

spring-boot-project/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-project/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-project/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-project/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)