/** * Creates a connection to the underlying containerized database instance. * * @param queryString query string parameters that should be appended to the JDBC connection URL. * The '?' character must be included * @return a Connection * @throws SQLException if there is a repeated failure to create the connection */ public Connection createConnection(String queryString) throws SQLException { final Properties info = new Properties(); info.put("user", this.getUsername()); info.put("password", this.getPassword()); final String url = constructUrlForConnection(queryString); final Driver jdbcDriverInstance = getJdbcDriverInstance(); try { return Unreliables.retryUntilSuccess(getConnectTimeoutSeconds(), TimeUnit.SECONDS, () -> DB_CONNECT_RATE_LIMIT.getWhenReady(() -> jdbcDriverInstance.connect(url, info))); } catch (Exception e) { throw new SQLException("Could not create new connection", e); } }
@Override protected void waitUntilContainerStarted() { // Repeatedly try and open a connection to the DB and execute a test query logger().info("Waiting for database connection to become available at {} using query '{}'", getJdbcUrl(), getTestQueryString()); Unreliables.retryUntilSuccess(getStartupTimeoutSeconds(), TimeUnit.SECONDS, () -> { if (!isRunning()) { throw new ContainerLaunchException("Container failed to start"); } try (Connection connection = createConnection("")) { boolean success = connection.createStatement().execute(JdbcDatabaseContainer.this.getTestQueryString()); if (success) { logger().info("Obtained a connection to container ({})", JdbcDatabaseContainer.this.getJdbcUrl()); return null; } else { throw new SQLException("Failed to execute test query"); } } }); }
@Override public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) { Objects.requireNonNull(connectionUrl, "Connection URL cannot be null"); final String databaseName = connectionUrl.getDatabaseName().orElse("test"); final String user = connectionUrl.getQueryParameters().getOrDefault(USER_PARAM, "test"); final String password = connectionUrl.getQueryParameters().getOrDefault(PASSWORD_PARAM, "test"); final JdbcDatabaseContainer instance; if (connectionUrl.getImageTag().isPresent()) { instance = newInstance(connectionUrl.getImageTag().get()); } else { instance = newInstance(); } return instance .withDatabaseName(databaseName) .withUsername(user) .withPassword(password); }
private JdbcDatabaseContainer<?> initContainer() { JdbcDatabaseContainer<?> postgisContainer = new PostgisContainerProvider() .newInstance() .withDatabaseName( POSTGRES_DATABASE_NAME ) .withUsername( POSTGRES_CREDENTIALS ) .withPassword( POSTGRES_CREDENTIALS ); postgisContainer.start(); log.info("Postgis container initialized: " + postgisContainer.getJdbcUrl()); return postgisContainer; } }
private ResultSet performQuery(JdbcDatabaseContainer container, String sql) throws SQLException { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl(container.getJdbcUrl()); hikariConfig.setUsername(container.getUsername()); hikariConfig.setPassword(container.getPassword()); HikariDataSource ds = new HikariDataSource(hikariConfig); Statement statement = ds.getConnection().createStatement(); statement.execute(sql); ResultSet resultSet = statement.getResultSet(); resultSet.next(); return resultSet; } }
if (candidateContainerType.supports(connectionUrl.getDatabaseType())) { container = candidateContainerType.newInstance(connectionUrl); delegate = container.getJdbcDriverInstance(); container.setParameters(parameters); container.start(); Connection connection = container.createConnection(queryString); if (!initializedContainers.contains(container.getContainerId())) { DatabaseDelegate databaseDelegate = new JdbcDatabaseDelegate(container, queryString); runInitScriptIfRequired(connectionUrl, databaseDelegate); runInitFunctionIfRequired(connectionUrl, connection); initializedContainers.add(container.getContainerId());
@Override protected String constructUrlForConnection(String queryString) { String url = super.constructUrlForConnection(queryString); if (! url.contains("useSSL=")) { String separator = url.contains("?") ? "&" : "?"; return url + separator + "useSSL=false"; } else { return url; } }
/** * Template method for constructing the JDBC URL to be used for creating {@link Connection}s. * This should be overridden if the JDBC URL and query string concatenation or URL string * construction needs to be different to normal. * * @param queryString query string parameters that should be appended to the JDBC connection URL. * The '?' character must be included * @return a full JDBC URL including queryString */ protected String constructUrlForConnection(String queryString) { return getJdbcUrl() + queryString; }
@Test public void shouldNotStopDaemonContainerWhenAllConnectionsClosed() throws SQLException { final String jdbcUrl = "jdbc:tc:postgresql:9.6.8://hostname/databasename?TC_DAEMON=true"; getConnectionAndClose(jdbcUrl); JdbcDatabaseContainer<?> container = ContainerDatabaseDriver.getContainer(jdbcUrl); assertNotNull("Database container instance is not null as expected", container); assertTrue("Database container is running as expected", container.isRunning()); }
@Override protected Statement createNewConnection() { try { return container.createConnection(queryString).createStatement(); } catch (SQLException e) { log.error("Could not obtain JDBC connection"); throw new ConnectionCreationException("Could not obtain JDBC connection", e); } }
@Bean( name = "dhisConfigurationProvider" ) public DhisConfigurationProvider dhisConfigurationProvider() { TestDhisConfigurationProvider dhisConfigurationProvider = new TestDhisConfigurationProvider(); JdbcDatabaseContainer<?> postgreSQLContainer = initContainer(); Properties properties = new Properties(); properties.setProperty( "connection.url", postgreSQLContainer.getJdbcUrl() ); properties.setProperty( "connection.dialect", "org.hisp.dhis.hibernate.dialect.DhisPostgresDialect" ); properties.setProperty( "connection.driver_class", "org.postgresql.Driver" ); properties.setProperty( "connection.username", postgreSQLContainer.getUsername() ); properties.setProperty( "connection.password", postgreSQLContainer.getPassword() ); dhisConfigurationProvider.addProperties( properties ); return dhisConfigurationProvider; }
if (candidateContainerType.supports(connectionUrl.getDatabaseType())) { container = candidateContainerType.newInstance(connectionUrl); delegate = container.getJdbcDriverInstance(); container.setParameters(parameters); container.start(); Connection connection = container.createConnection(queryString); if (!initializedContainers.contains(container.getContainerId())) { DatabaseDelegate databaseDelegate = new JdbcDatabaseDelegate(container, queryString); runInitScriptIfRequired(connectionUrl, databaseDelegate); runInitFunctionIfRequired(connectionUrl, connection); initializedContainers.add(container.getContainerId());
@Override protected String constructUrlForConnection(String queryString) { String url = super.constructUrlForConnection(queryString); if (! url.contains("useSSL=")) { String separator = url.contains("?") ? "&" : "?"; return url + separator + "useSSL=false"; } else { return url; } }
@Override protected Statement createNewConnection() { try { return container.createConnection(queryString).createStatement(); } catch (SQLException e) { log.error("Could not obtain JDBC connection"); throw new ConnectionCreationException("Could not obtain JDBC connection", e); } }
/** * Creates a connection to the underlying containerized database instance. * * @param queryString query string parameters that should be appended to the JDBC connection URL. * The '?' character must be included * @return a Connection * @throws SQLException if there is a repeated failure to create the connection */ public Connection createConnection(String queryString) throws SQLException { final Properties info = new Properties(); info.put("user", this.getUsername()); info.put("password", this.getPassword()); final String url = constructUrlForConnection(queryString); final Driver jdbcDriverInstance = getJdbcDriverInstance(); try { return Unreliables.retryUntilSuccess(getConnectTimeoutSeconds(), TimeUnit.SECONDS, () -> DB_CONNECT_RATE_LIMIT.getWhenReady(() -> jdbcDriverInstance.connect(url, info))); } catch (Exception e) { throw new SQLException("Could not create new connection", e); } }
@Override protected void waitUntilContainerStarted() { // Repeatedly try and open a connection to the DB and execute a test query logger().info("Waiting for database connection to become available at {} using query \'{}\'", getJdbcUrl(), getTestQueryString()); Unreliables.retryUntilSuccess(getStartupTimeoutSeconds(), TimeUnit.SECONDS, () -> { if (!isRunning()) { throw new ContainerLaunchException("Container failed to start"); } try (Connection connection = createConnection("")) { boolean success = connection.createStatement().execute(JdbcDatabaseContainer.this.getTestQueryString()); if (success) { logger().info("Obtained a connection to container ({})", JdbcDatabaseContainer.this.getJdbcUrl()); return null; } else { throw new SQLException("Failed to execute test query"); } } }); }
@Override public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) { Objects.requireNonNull(connectionUrl, "Connection URL cannot be null"); final String databaseName = connectionUrl.getDatabaseName().orElse("test"); final String user = connectionUrl.getQueryParameters().getOrDefault(USER_PARAM, "test"); final String password = connectionUrl.getQueryParameters().getOrDefault(PASSWORD_PARAM, "test"); final JdbcDatabaseContainer instance; if (connectionUrl.getImageTag().isPresent()) { instance = newInstance(connectionUrl.getImageTag().get()); } else { instance = newInstance(); } return instance .withDatabaseName(databaseName) .withUsername(user) .withPassword(password); }
@Override public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) { Objects.requireNonNull(connectionUrl, "Connection URL cannot be null"); final String databaseName = connectionUrl.getDatabaseName().orElse("test"); final String user = connectionUrl.getQueryParameters().getOrDefault(USER_PARAM, "test"); final String password = connectionUrl.getQueryParameters().getOrDefault(PASSWORD_PARAM, "test"); final JdbcDatabaseContainer instance; if (connectionUrl.getImageTag().isPresent()) { instance = newInstance(connectionUrl.getImageTag().get()); } else { instance = newInstance(); } return instance .withDatabaseName(databaseName) .withUsername(user) .withPassword(password); }