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
This commit is contained in:
3
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 -->
|
||||
<db2.version>11.5.8.0</db2.version>
|
||||
<h2.version>2.1.214</h2.version>
|
||||
<hikari.version>5.1.0</hikari.version>
|
||||
<hsqldb.version>2.7.1</hsqldb.version>
|
||||
<mariadb-java-client.version>3.1.3</mariadb-java-client.version>
|
||||
<mssql.version>12.2.0.jre11</mssql.version>
|
||||
@@ -45,7 +46,7 @@
|
||||
-->
|
||||
<oracle.version>23.3.0.23.09</oracle.version>
|
||||
|
||||
<!-- test utilities-->
|
||||
<!-- test dependencies -->
|
||||
<awaitility.version>4.2.0</awaitility.version>
|
||||
<archunit.version>1.0.1</archunit.version>
|
||||
|
||||
|
||||
@@ -233,6 +233,12 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.zaxxer</groupId>
|
||||
<artifactId>HikariCP</artifactId>
|
||||
<version>${hikari.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@@ -24,6 +24,8 @@ import java.util.concurrent.TimeUnit;
|
||||
|
||||
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.LogFactory;
|
||||
import org.awaitility.Awaitility;
|
||||
|
||||
@@ -27,12 +27,13 @@ import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
|
||||
import org.testcontainers.oracle.OracleContainer;
|
||||
import org.testcontainers.utility.DockerImageName;
|
||||
|
||||
import com.zaxxer.hikari.HikariConfig;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
|
||||
/**
|
||||
* {@link DataSource} setup for Oracle Database XE. Starts a docker container with an Oracle database.
|
||||
*
|
||||
* @see <a href=
|
||||
* "https://blogs.oracle.com/oraclemagazine/deliver-oracle-database-18c-express-edition-in-containers">Oracle
|
||||
* Docker Image</a>
|
||||
* @see <a href= "https://blogs.oracle.com/oraclemagazine/deliver-oracle-database-18c-express-edition-in-containers">Oracle Docker Image</a>
|
||||
* @see <a href="https://www.testcontainers.org/modules/databases/oraclexe/">Testcontainers Oracle</a>
|
||||
* @author Thomas Lang
|
||||
* @author Jens Schauder
|
||||
@@ -43,16 +44,16 @@ public class OracleDataSourceConfiguration extends DataSourceConfiguration {
|
||||
|
||||
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) {
|
||||
super(testClass, environment);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DataSource createDataSource() {
|
||||
protected synchronized DataSource createDataSource() {
|
||||
|
||||
if (ORACLE_CONTAINER == null) {
|
||||
if (DATA_SOURCE == null) {
|
||||
|
||||
LOG.info("Oracle starting...");
|
||||
DockerImageName dockerImageName = DockerImageName.parse("gvenzl/oracle-free:23.3-slim");
|
||||
@@ -62,21 +63,33 @@ public class OracleDataSourceConfiguration extends DataSourceConfiguration {
|
||||
container.start();
|
||||
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()));
|
||||
}
|
||||
|
||||
initDb();
|
||||
|
||||
return new DriverManagerDataSource(ORACLE_CONTAINER.getJdbcUrl(), ORACLE_CONTAINER.getUsername(),
|
||||
ORACLE_CONTAINER.getPassword());
|
||||
return DATA_SOURCE;
|
||||
}
|
||||
|
||||
private void initDb() {
|
||||
private DataSource poolDataSource(DataSource dataSource) {
|
||||
|
||||
final DriverManagerDataSource dataSource = new DriverManagerDataSource(ORACLE_CONTAINER.getJdbcUrl(), "SYSTEM",
|
||||
ORACLE_CONTAINER.getPassword());
|
||||
HikariConfig config = new HikariConfig();
|
||||
config.setDataSource(dataSource);
|
||||
|
||||
config.setMaximumPoolSize(10);
|
||||
config.setIdleTimeout(30000);
|
||||
config.setMaxLifetime(600000);
|
||||
config.setConnectionTimeout(30000);
|
||||
|
||||
return new HikariDataSource(config);
|
||||
}
|
||||
|
||||
private void initDb(String jdbcUrl, String username, String password) {
|
||||
|
||||
final DriverManagerDataSource dataSource = new DriverManagerDataSource(jdbcUrl, "SYSTEM",
|
||||
password);
|
||||
final JdbcTemplate jdbc = new JdbcTemplate(dataSource);
|
||||
jdbc.execute("GRANT ALL PRIVILEGES TO " + ORACLE_CONTAINER.getUsername());
|
||||
jdbc.execute("GRANT ALL PRIVILEGES TO " + username);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -103,7 +103,6 @@
|
||||
<version>4.6</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
||||
Reference in New Issue
Block a user