Merge pull request #23403 from fabio-grassi-gbs
* pr/23403: Polish "Add support for Oracle UCP" Add support for Oracle UCP Closes gh-23403pull/23540/head
commit
a983fb9559
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.autoconfigure.jdbc;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import oracle.ucp.jdbc.PoolDataSource;
|
||||
import oracle.ucp.jdbc.PoolDataSourceImpl;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link DataSourceAutoConfiguration} with Oracle UCP.
|
||||
*
|
||||
* @author Fabio Grassi
|
||||
* @author Stephane Nicoll
|
||||
*/
|
||||
class OracleUcpDataSourceConfigurationTests {
|
||||
|
||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class))
|
||||
.withPropertyValues("spring.datasource.initialization-mode=never",
|
||||
"spring.datasource.type=" + PoolDataSource.class.getName());
|
||||
|
||||
@Test
|
||||
void testDataSourceExists() {
|
||||
this.contextRunner.run((context) -> {
|
||||
assertThat(context.getBeansOfType(DataSource.class)).hasSize(1);
|
||||
assertThat(context.getBeansOfType(PoolDataSourceImpl.class)).hasSize(1);
|
||||
try (Connection connection = context.getBean(DataSource.class).getConnection()) {
|
||||
assertThat(connection.isValid(1000)).isTrue();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDataSourcePropertiesOverridden() {
|
||||
this.contextRunner.withPropertyValues("spring.datasource.oracleucp.url=jdbc:foo//bar/spam",
|
||||
"spring.datasource.oracleucp.max-idle-time=1234").run((context) -> {
|
||||
PoolDataSourceImpl ds = context.getBean(PoolDataSourceImpl.class);
|
||||
assertThat(ds.getURL()).isEqualTo("jdbc:foo//bar/spam");
|
||||
assertThat(ds.getMaxIdleTime()).isEqualTo(1234);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDataSourceConnectionPropertiesOverridden() {
|
||||
this.contextRunner.withPropertyValues("spring.datasource.oracleucp.connection-properties.autoCommit=false")
|
||||
.run((context) -> {
|
||||
PoolDataSourceImpl ds = context.getBean(PoolDataSourceImpl.class);
|
||||
assertThat(ds.getConnectionProperty("autoCommit")).isEqualTo("false");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDataSourceDefaultsPreserved() {
|
||||
this.contextRunner.run((context) -> {
|
||||
PoolDataSourceImpl ds = context.getBean(PoolDataSourceImpl.class);
|
||||
assertThat(ds.getInitialPoolSize()).isEqualTo(0);
|
||||
assertThat(ds.getMinPoolSize()).isEqualTo(0);
|
||||
assertThat(ds.getMaxPoolSize()).isEqualTo(Integer.MAX_VALUE);
|
||||
assertThat(ds.getInactiveConnectionTimeout()).isEqualTo(0);
|
||||
assertThat(ds.getConnectionWaitTimeout()).isEqualTo(3);
|
||||
assertThat(ds.getTimeToLiveConnectionTimeout()).isEqualTo(0);
|
||||
assertThat(ds.getAbandonedConnectionTimeout()).isEqualTo(0);
|
||||
assertThat(ds.getTimeoutCheckInterval()).isEqualTo(30);
|
||||
assertThat(ds.getFastConnectionFailoverEnabled()).isFalse();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void nameIsAliasedToPoolName() {
|
||||
this.contextRunner.withPropertyValues("spring.datasource.name=myDS").run((context) -> {
|
||||
PoolDataSourceImpl ds = context.getBean(PoolDataSourceImpl.class);
|
||||
assertThat(ds.getConnectionPoolName()).isEqualTo("myDS");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void poolNameTakesPrecedenceOverName() {
|
||||
this.contextRunner.withPropertyValues("spring.datasource.name=myDS",
|
||||
"spring.datasource.oracleucp.connection-pool-name=myOracleUcpDS").run((context) -> {
|
||||
PoolDataSourceImpl ds = context.getBean(PoolDataSourceImpl.class);
|
||||
assertThat(ds.getConnectionPoolName()).isEqualTo("myOracleUcpDS");
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.jdbc.metadata;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import oracle.ucp.jdbc.PoolDataSource;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* {@link DataSourcePoolMetadata} for an Oracle UCP {@link DataSource}.
|
||||
*
|
||||
* @author Fabio Grassi
|
||||
* @since 2.4.0
|
||||
*/
|
||||
public class OracleUcpDataSourcePoolMetadata extends AbstractDataSourcePoolMetadata<PoolDataSource> {
|
||||
|
||||
public OracleUcpDataSourcePoolMetadata(PoolDataSource dataSource) {
|
||||
super(dataSource);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getActive() {
|
||||
try {
|
||||
return getDataSource().getBorrowedConnectionsCount();
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getIdle() {
|
||||
try {
|
||||
return getDataSource().getAvailableConnectionsCount();
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getMax() {
|
||||
return getDataSource().getMaxPoolSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getMin() {
|
||||
return getDataSource().getMinPoolSize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValidationQuery() {
|
||||
return getDataSource().getSQLForValidateConnection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean getDefaultAutoCommit() {
|
||||
String autoCommit = getDataSource().getConnectionProperty("autoCommit");
|
||||
return StringUtils.hasText(autoCommit) ? Boolean.valueOf(autoCommit) : null;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.jdbc.metadata;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
import oracle.ucp.jdbc.PoolDataSource;
|
||||
import oracle.ucp.jdbc.PoolDataSourceImpl;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link OracleUcpDataSourcePoolMetadata}.
|
||||
*
|
||||
* @author Fabio Grassi
|
||||
*/
|
||||
class OracleUcpDataSourcePoolMetadataTests
|
||||
extends AbstractDataSourcePoolMetadataTests<OracleUcpDataSourcePoolMetadata> {
|
||||
|
||||
private final OracleUcpDataSourcePoolMetadata dataSourceMetadata = new OracleUcpDataSourcePoolMetadata(
|
||||
createDataSource(0, 2));
|
||||
|
||||
@Override
|
||||
protected OracleUcpDataSourcePoolMetadata getDataSourceMetadata() {
|
||||
return this.dataSourceMetadata;
|
||||
}
|
||||
|
||||
@Override
|
||||
void getValidationQuery() throws SQLException {
|
||||
PoolDataSource dataSource = createDataSource(0, 4);
|
||||
dataSource.setSQLForValidateConnection("SELECT NULL FROM DUAL");
|
||||
assertThat(new OracleUcpDataSourcePoolMetadata(dataSource).getValidationQuery())
|
||||
.isEqualTo("SELECT NULL FROM DUAL");
|
||||
}
|
||||
|
||||
@Override
|
||||
void getDefaultAutoCommit() throws SQLException {
|
||||
PoolDataSource dataSource = createDataSource(0, 4);
|
||||
dataSource.setConnectionProperty("autoCommit", "false");
|
||||
assertThat(new OracleUcpDataSourcePoolMetadata(dataSource).getDefaultAutoCommit()).isFalse();
|
||||
}
|
||||
|
||||
private PoolDataSource createDataSource(int minSize, int maxSize) {
|
||||
try {
|
||||
PoolDataSource dataSource = initializeBuilder().type(PoolDataSourceImpl.class).build();
|
||||
dataSource.setInitialPoolSize(minSize);
|
||||
dataSource.setMinPoolSize(minSize);
|
||||
dataSource.setMaxPoolSize(maxSize);
|
||||
return dataSource;
|
||||
}
|
||||
catch (SQLException ex) {
|
||||
throw new IllegalStateException("Error while configuring PoolDataSource", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue