Skip to content

Commit 800eb01

Browse files
committed
Change the default JDBC connection pool to Hikari
Closes gh-6013
1 parent 2e491df commit 800eb01

File tree

6 files changed

+39
-37
lines changed

6 files changed

+39
-37
lines changed

spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/PublicMetricsAutoConfigurationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,10 @@ public void noDataSource() {
126126
}
127127

128128
@Test
129-
public void autoDataSource() {
129+
public void autoDataSource() throws SQLException {
130130
load(DataSourceAutoConfiguration.class);
131131
PublicMetrics bean = this.context.getBean(DataSourcePublicMetrics.class);
132+
this.context.getBean(DataSource.class).getConnection().close();
132133
Collection<Metric<?>> metrics = bean.metrics();
133134
assertMetrics(metrics, "datasource.primary.active", "datasource.primary.usage");
134135
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ protected static class EmbeddedDatabaseConfiguration {
104104
@Configuration
105105
@Conditional(PooledDataSourceCondition.class)
106106
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
107-
@Import({ DataSourceConfiguration.Tomcat.class, DataSourceConfiguration.Hikari.class,
107+
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
108108
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class })
109109
protected static class PooledDataSourceConfiguration {
110110

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfigurationTests.java

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,8 @@ public void testDataSourceHasEmbeddedDefault() throws Exception {
8484
this.context.register(DataSourceAutoConfiguration.class,
8585
PropertyPlaceholderAutoConfiguration.class);
8686
this.context.refresh();
87-
org.apache.tomcat.jdbc.pool.DataSource dataSource = this.context
88-
.getBean(org.apache.tomcat.jdbc.pool.DataSource.class);
89-
assertThat(dataSource.getUrl()).isNotNull();
87+
HikariDataSource dataSource = this.context.getBean(HikariDataSource.class);
88+
assertThat(dataSource.getJdbcUrl()).isNotNull();
9089
assertThat(dataSource.getDriverClassName()).isNotNull();
9190
}
9291

@@ -114,41 +113,41 @@ public void testBadDriverClass() throws Exception {
114113
}
115114

116115
@Test
117-
public void tomcatValidatesConnectionByDefault() {
118-
org.apache.tomcat.jdbc.pool.DataSource dataSource = autoConfigureDataSource(
119-
org.apache.tomcat.jdbc.pool.DataSource.class);
120-
assertThat(dataSource.isTestOnBorrow()).isTrue();
121-
assertThat(dataSource.getValidationQuery())
122-
.isEqualTo(DatabaseDriver.HSQLDB.getValidationQuery());
116+
public void hikariValidatesConnectionByDefault() throws Exception {
117+
HikariDataSource dataSource = autoConfigureDataSource(HikariDataSource.class,
118+
"org.apache.tomcat");
119+
assertThat(dataSource.getConnectionTestQuery()).isNull();
120+
// Use Connection#isValid()
123121
}
124122

125123
@Test
126-
public void hikariIsFallback() throws Exception {
127-
HikariDataSource dataSource = autoConfigureDataSource(HikariDataSource.class,
128-
"org.apache.tomcat");
129-
assertThat(dataSource.getJdbcUrl()).isEqualTo("jdbc:hsqldb:mem:testdb");
124+
public void tomcatIsFallback() throws Exception {
125+
org.apache.tomcat.jdbc.pool.DataSource dataSource = autoConfigureDataSource(
126+
org.apache.tomcat.jdbc.pool.DataSource.class, "com.zaxxer.hikari");
127+
assertThat(dataSource.getUrl()).isEqualTo("jdbc:hsqldb:mem:testdb");
130128
}
131129

132130
@Test
133-
public void hikariValidatesConnectionByDefault() throws Exception {
134-
HikariDataSource dataSource = autoConfigureDataSource(HikariDataSource.class,
135-
"org.apache.tomcat");
136-
assertThat(dataSource.getConnectionTestQuery()).isNull();
137-
// Use Connection#isValid()
131+
public void tomcatValidatesConnectionByDefault() {
132+
org.apache.tomcat.jdbc.pool.DataSource dataSource = autoConfigureDataSource(
133+
org.apache.tomcat.jdbc.pool.DataSource.class, "com.zaxxer.hikari");
134+
assertThat(dataSource.isTestOnBorrow()).isTrue();
135+
assertThat(dataSource.getValidationQuery())
136+
.isEqualTo(DatabaseDriver.HSQLDB.getValidationQuery());
138137
}
139138

140139
@Test
141140
public void commonsDbcp2IsFallback() throws Exception {
142141
BasicDataSource dataSource = autoConfigureDataSource(BasicDataSource.class,
143-
"org.apache.tomcat", "com.zaxxer.hikari");
142+
"com.zaxxer.hikari", "org.apache.tomcat");
144143
assertThat(dataSource.getUrl()).isEqualTo("jdbc:hsqldb:mem:testdb");
145144
}
146145

147146
@Test
148147
public void commonsDbcp2ValidatesConnectionByDefault() throws Exception {
149148
org.apache.commons.dbcp2.BasicDataSource dataSource = autoConfigureDataSource(
150-
org.apache.commons.dbcp2.BasicDataSource.class, "org.apache.tomcat",
151-
"com.zaxxer.hikari");
149+
org.apache.commons.dbcp2.BasicDataSource.class, "com.zaxxer.hikari",
150+
"org.apache.tomcat");
152151
assertThat(dataSource.getTestOnBorrow()).isEqualTo(true);
153152
assertThat(dataSource.getValidationQuery()).isNull(); // Use Connection#isValid()
154153
}
@@ -163,7 +162,7 @@ public void testEmbeddedTypeDefaultsUsername() throws Exception {
163162
this.context.refresh();
164163
DataSource bean = this.context.getBean(DataSource.class);
165164
assertThat(bean).isNotNull();
166-
org.apache.tomcat.jdbc.pool.DataSource pool = (org.apache.tomcat.jdbc.pool.DataSource) bean;
165+
HikariDataSource pool = (HikariDataSource) bean;
167166
assertThat(pool.getDriverClassName()).isEqualTo("org.hsqldb.jdbcDriver");
168167
assertThat(pool.getUsername()).isEqualTo("sa");
169168
}
@@ -215,7 +214,7 @@ public void testExplicitDriverClassClearsUsername() throws Exception {
215214
this.context.refresh();
216215
DataSource bean = this.context.getBean(DataSource.class);
217216
assertThat(bean).isNotNull();
218-
org.apache.tomcat.jdbc.pool.DataSource pool = (org.apache.tomcat.jdbc.pool.DataSource) bean;
217+
HikariDataSource pool = (HikariDataSource) bean;
219218
assertThat(pool.getDriverClassName()).isEqualTo(
220219
"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationTests$DatabaseTestDriver");
221220
assertThat(pool.getUsername()).isNull();

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializerTests.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import javax.sql.DataSource;
2626

27+
import com.zaxxer.hikari.HikariDataSource;
2728
import org.junit.After;
2829
import org.junit.Before;
2930
import org.junit.Rule;
@@ -112,7 +113,7 @@ public void testDataSourceInitialized() throws Exception {
112113
PropertyPlaceholderAutoConfiguration.class);
113114
this.context.refresh();
114115
DataSource dataSource = this.context.getBean(DataSource.class);
115-
assertThat(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource).isTrue();
116+
assertThat(dataSource).isInstanceOf(HikariDataSource.class);
116117
assertThat(dataSource).isNotNull();
117118
JdbcOperations template = new JdbcTemplate(dataSource);
118119
assertThat(template.queryForObject("SELECT COUNT(*) from BAR", Integer.class))
@@ -131,7 +132,7 @@ public void testDataSourceInitializedWithExplicitScript() throws Exception {
131132
.addResourcePathToPackagePath(getClass(), "data.sql"));
132133
this.context.refresh();
133134
DataSource dataSource = this.context.getBean(DataSource.class);
134-
assertThat(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource).isTrue();
135+
assertThat(dataSource).isInstanceOf(HikariDataSource.class);
135136
assertThat(dataSource).isNotNull();
136137
JdbcOperations template = new JdbcTemplate(dataSource);
137138
assertThat(template.queryForObject("SELECT COUNT(*) from FOO", Integer.class))
@@ -154,7 +155,7 @@ public void testDataSourceInitializedWithMultipleScripts() throws Exception {
154155
PropertyPlaceholderAutoConfiguration.class);
155156
this.context.refresh();
156157
DataSource dataSource = this.context.getBean(DataSource.class);
157-
assertThat(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource).isTrue();
158+
assertThat(dataSource).isInstanceOf(HikariDataSource.class);
158159
assertThat(dataSource).isNotNull();
159160
JdbcOperations template = new JdbcTemplate(dataSource);
160161
assertThat(template.queryForObject("SELECT COUNT(*) from FOO", Integer.class))
@@ -177,7 +178,7 @@ public void testDataSourceInitializedWithExplicitSqlScriptEncoding()
177178
.addResourcePathToPackagePath(getClass(), "encoding-data.sql"));
178179
this.context.refresh();
179180
DataSource dataSource = this.context.getBean(DataSource.class);
180-
assertThat(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource).isTrue();
181+
assertThat(dataSource).isInstanceOf(HikariDataSource.class);
181182
assertThat(dataSource).isNotNull();
182183
JdbcOperations template = new JdbcTemplate(dataSource);
183184
assertThat(template.queryForObject("SELECT COUNT(*) from BAR", Integer.class))
@@ -197,7 +198,7 @@ public void testInitializationDisabled() throws Exception {
197198
this.context.refresh();
198199
DataSource dataSource = this.context.getBean(DataSource.class);
199200
this.context.publishEvent(new DataSourceInitializedEvent(dataSource));
200-
assertThat(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource).isTrue();
201+
assertThat(dataSource).isInstanceOf(HikariDataSource.class);
201202
assertThat(dataSource).isNotNull();
202203
JdbcOperations template = new JdbcTemplate(dataSource);
203204
try {
@@ -270,7 +271,7 @@ public void multipleScriptsAppliedInLexicalOrder() throws Exception {
270271
this.context.setResourceLoader(resourceLoader);
271272
this.context.refresh();
272273
DataSource dataSource = this.context.getBean(DataSource.class);
273-
assertThat(dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource).isTrue();
274+
assertThat(dataSource).isInstanceOf(HikariDataSource.class);
274275
assertThat(dataSource).isNotNull();
275276
JdbcOperations template = new JdbcTemplate(dataSource);
276277
assertThat(template.queryForObject("SELECT COUNT(*) from FOO", Integer.class))

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/CustomHibernateJpaAutoConfigurationTests.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public void testDefaultDdlAutoForMySql() throws Exception {
6464
// Set up environment so we get a MySQL database but don't require server to be
6565
// running...
6666
EnvironmentTestUtils.addEnvironment(this.context,
67+
"spring.datasource.type:" + org.apache.tomcat.jdbc.pool.DataSource.class.getName(),
6768
"spring.datasource.database:mysql",
6869
"spring.datasource.url:jdbc:mysql://localhost/nonexistent",
6970
"spring.datasource.initialize:false", "spring.jpa.database:MYSQL");

spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2821,10 +2821,10 @@ ensuring that it happens once access to the database is no longer needed.
28212821
Production database connections can also be auto-configured using a pooling `DataSource`.
28222822
Here's the algorithm for choosing a specific implementation:
28232823

2824-
* We prefer the Tomcat pooling `DataSource` for its performance and concurrency, so if
2825-
that is available we always choose it.
2826-
* Otherwise, if HikariCP is available we will use it.
2827-
* If neither the Tomcat pooling datasource nor HikariCP are available and if Commons
2824+
* We prefer HikariCP for its performance and concurrency, so if that is available we
2825+
always choose it.
2826+
* Otherwise, if the Tomcat pooling `DataSource` is available we will use it.
2827+
* If neither HikariCP nor the Tomcat pooling datasource are available and if Commons
28282828
DBCP2 is available we will use it.
28292829

28302830
If you use the `spring-boot-starter-jdbc` or `spring-boot-starter-data-jpa`
@@ -2863,8 +2863,8 @@ loadable.
28632863
See {sc-spring-boot-autoconfigure}/jdbc/DataSourceProperties.{sc-ext}[`DataSourceProperties`]
28642864
for more of the supported options. These are the standard options that work regardless of
28652865
the actual implementation. It is also possible to fine-tune implementation-specific
2866-
settings using their respective prefix (`+spring.datasource.tomcat.*+`,
2867-
`+spring.datasource.hikari.*+`, and `+spring.datasource.dbcp2.*+`). Refer to the
2866+
settings using their respective prefix (`+spring.datasource.hikari.*+`,
2867+
`+spring.datasource.tomcat.*+`, and `+spring.datasource.dbcp2.*+`). Refer to the
28682868
documentation of the connection pool implementation you are using for more details.
28692869

28702870
For instance, if you are using the

0 commit comments

Comments
 (0)