Browse Source

Create one connection pool for Oracle.

We now use one pooled `DataSource` for Oracle.

This should avoid problems with the TNS-Listener, which seems to have a problem with constantly opening and closing connections.

Closes #1815
Original pull request #1816
pull/1825/head
Jens Schauder 2 years ago
parent
commit
236d054a0e
No known key found for this signature in database
GPG Key ID: 89F36EDF8C1BEA56
  1. 3
      pom.xml
  2. 6
      spring-data-jdbc/pom.xml
  3. 2
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/DataSourceConfiguration.java
  4. 41
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/OracleDataSourceConfiguration.java
  5. 1
      spring-data-relational/pom.xml

3
pom.xml

@ -33,6 +33,7 @@
<!-- note that these currently do not control the versions of databases used via Testcontainers for testing --> <!-- note that these currently do not control the versions of databases used via Testcontainers for testing -->
<db2.version>11.5.8.0</db2.version> <db2.version>11.5.8.0</db2.version>
<h2.version>2.1.214</h2.version> <h2.version>2.1.214</h2.version>
<hikari.version>5.1.0</hikari.version>
<hsqldb.version>2.7.1</hsqldb.version> <hsqldb.version>2.7.1</hsqldb.version>
<mariadb-java-client.version>3.1.3</mariadb-java-client.version> <mariadb-java-client.version>3.1.3</mariadb-java-client.version>
<mssql.version>12.2.0.jre11</mssql.version> <mssql.version>12.2.0.jre11</mssql.version>
@ -40,7 +41,7 @@
<postgresql.version>42.6.0</postgresql.version> <postgresql.version>42.6.0</postgresql.version>
<oracle.version>23.4.0.24.05</oracle.version> <oracle.version>23.4.0.24.05</oracle.version>
<!-- test utilities--> <!-- test dependencies -->
<awaitility.version>4.2.0</awaitility.version> <awaitility.version>4.2.0</awaitility.version>
<archunit.version>1.0.1</archunit.version> <archunit.version>1.0.1</archunit.version>

6
spring-data-jdbc/pom.xml

@ -233,6 +233,12 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>${hikari.version}</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

2
spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/DataSourceConfiguration.java

@ -24,6 +24,8 @@ import java.util.concurrent.TimeUnit;
import javax.sql.DataSource; import javax.sql.DataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.awaitility.Awaitility; import org.awaitility.Awaitility;

41
spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/OracleDataSourceConfiguration.java

@ -27,12 +27,13 @@ import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.testcontainers.oracle.OracleContainer; import org.testcontainers.oracle.OracleContainer;
import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.DockerImageName;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
/** /**
* {@link DataSource} setup for Oracle Database 23ai FREE. Starts a docker container with an Oracle database. * {@link DataSource} setup for Oracle Database 23ai FREE. Starts a docker container with an Oracle database.
* *
* @see <a href= * @see <a href= "https://github.com/gvenzl/oci-oracle-free">Oracle Docker Image</a>
* "https://github.com/gvenzl/oci-oracle-free">Oracle
* Docker Image</a>
* @see <a href="https://www.testcontainers.org/modules/databases/oraclexe/">Testcontainers Oracle</a> * @see <a href="https://www.testcontainers.org/modules/databases/oraclexe/">Testcontainers Oracle</a>
* @author Thomas Lang * @author Thomas Lang
* @author Jens Schauder * @author Jens Schauder
@ -44,16 +45,16 @@ public class OracleDataSourceConfiguration extends DataSourceConfiguration {
private static final Log LOG = LogFactory.getLog(OracleDataSourceConfiguration.class); private static final Log LOG = LogFactory.getLog(OracleDataSourceConfiguration.class);
private static OracleContainer ORACLE_CONTAINER; private static DataSource DATA_SOURCE;
public OracleDataSourceConfiguration(TestClass testClass, Environment environment) { public OracleDataSourceConfiguration(TestClass testClass, Environment environment) {
super(testClass, environment); super(testClass, environment);
} }
@Override @Override
protected DataSource createDataSource() { protected synchronized DataSource createDataSource() {
if (ORACLE_CONTAINER == null) { if (DATA_SOURCE == null) {
LOG.info("Oracle starting..."); LOG.info("Oracle starting...");
DockerImageName dockerImageName = DockerImageName.parse("gvenzl/oracle-free:23-slim"); DockerImageName dockerImageName = DockerImageName.parse("gvenzl/oracle-free:23-slim");
@ -63,21 +64,33 @@ public class OracleDataSourceConfiguration extends DataSourceConfiguration {
container.start(); container.start();
LOG.info("Oracle started"); LOG.info("Oracle started");
ORACLE_CONTAINER = container; initDb(container.getJdbcUrl(),container.getUsername(), container.getPassword());
DATA_SOURCE = poolDataSource(new DriverManagerDataSource(container.getJdbcUrl(),
container.getUsername(), container.getPassword()));
} }
return DATA_SOURCE;
}
private DataSource poolDataSource(DataSource dataSource) {
HikariConfig config = new HikariConfig();
config.setDataSource(dataSource);
initDb(); config.setMaximumPoolSize(10);
config.setIdleTimeout(30000);
config.setMaxLifetime(600000);
config.setConnectionTimeout(30000);
return new DriverManagerDataSource(ORACLE_CONTAINER.getJdbcUrl(), ORACLE_CONTAINER.getUsername(), return new HikariDataSource(config);
ORACLE_CONTAINER.getPassword());
} }
private void initDb() { private void initDb(String jdbcUrl, String username, String password) {
final DriverManagerDataSource dataSource = new DriverManagerDataSource(ORACLE_CONTAINER.getJdbcUrl(), "system", final DriverManagerDataSource dataSource = new DriverManagerDataSource(jdbcUrl, "system",
ORACLE_CONTAINER.getPassword()); password);
final JdbcTemplate jdbc = new JdbcTemplate(dataSource); final JdbcTemplate jdbc = new JdbcTemplate(dataSource);
jdbc.execute("GRANT ALL PRIVILEGES TO " + ORACLE_CONTAINER.getUsername()); jdbc.execute("GRANT ALL PRIVILEGES TO " + username);
} }
@Override @Override

1
spring-data-relational/pom.xml

@ -104,7 +104,6 @@
<version>${jsqlparser}</version> <version>${jsqlparser}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

Loading…
Cancel
Save