@ -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 ( ORA CL E_CONTAINER = = null ) {
if ( DATA_S OU RCE = = 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 . getPa ssword( ) ) ;
pa ssword) ;
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