Skip to content

Commit 76d464f

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 9f7f5c2 commit 76d464f

File tree

5 files changed

+49
-1
lines changed

5 files changed

+49
-1
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/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-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/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-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/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-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/metadata/TomcatDataSourcePoolMetadata.java

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

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

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

Lines changed: 26 additions & 1 deletion
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.LinkedHashMap;
2122
import java.util.Map;
2223

@@ -35,6 +36,9 @@
3536
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3637
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
3738
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
39+
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadata;
40+
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProvider;
41+
import org.springframework.boot.autoconfigure.jdbc.metadata.DataSourcePoolMetadataProviders;
3842
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.HibernateEntityManagerCondition;
3943
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
4044
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
@@ -70,6 +74,8 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
7074

7175
private static final String JTA_PLATFORM = "hibernate.transaction.jta.platform";
7276

77+
private static final String PROVIDER_DISABLES_AUTOCOMMIT = "hibernate.connection.provider_disables_autocommit";
78+
7379
/**
7480
* {@code NoJtaPlatform} implementations for various Hibernate versions.
7581
*/
@@ -85,12 +91,16 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
8591
"org.hibernate.engine.transaction.jta.platform.internal.WebSphereExtendedJtaPlatform",
8692
"org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform", };
8793

94+
private final Collection<DataSourcePoolMetadataProvider> metadataProviders;
95+
8896
public HibernateJpaAutoConfiguration(DataSource dataSource,
8997
JpaProperties jpaProperties,
9098
ObjectProvider<JtaTransactionManager> jtaTransactionManager,
91-
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
99+
ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers,
100+
ObjectProvider<Collection<DataSourcePoolMetadataProvider>> metadataProviders) {
92101
super(dataSource, jpaProperties, jtaTransactionManager,
93102
transactionManagerCustomizers);
103+
this.metadataProviders = metadataProviders.getIfAvailable();
94104
}
95105

96106
@Override
@@ -111,6 +121,9 @@ protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
111121
if (!vendorProperties.containsKey(JTA_PLATFORM)) {
112122
configureJtaPlatform(vendorProperties);
113123
}
124+
if (!vendorProperties.containsKey(PROVIDER_DISABLES_AUTOCOMMIT)) {
125+
configureProviderDisablesAutocommit(vendorProperties);
126+
}
114127
}
115128

116129
private void configureJtaPlatform(Map<String, Object> vendorProperties)
@@ -132,6 +145,18 @@ private void configureJtaPlatform(Map<String, Object> vendorProperties)
132145
}
133146
}
134147

148+
private void configureProviderDisablesAutocommit(Map<String, Object> vendorProperties) {
149+
DataSourcePoolMetadataProvider poolMetadataProvider = new DataSourcePoolMetadataProviders(
150+
this.metadataProviders);
151+
DataSourcePoolMetadata poolMetadata = poolMetadataProvider
152+
.getDataSourcePoolMetadata(getDataSource());
153+
if (poolMetadata != null
154+
&& Boolean.FALSE.equals(poolMetadata.getDefaultAutoCommit())
155+
&& getJtaTransactionManager() == null) {
156+
vendorProperties.put(PROVIDER_DISABLES_AUTOCOMMIT, "true");
157+
}
158+
}
159+
135160
private boolean runningOnWebSphere() {
136161
return ClassUtils.isPresent(
137162
"com.ibm.websphere.jtaextensions." + "ExtendedJTATransaction",

0 commit comments

Comments
 (0)