In my project, we define database initialization scripts via jdbc:initialize-database element.

        <jdbc:initialize-database data-source="dataSource">
            <jdbc:script location="classpath:db/schema.mysql.sql"/>
            <jdbc:script location="classpath:db/data.sql"/>
        </jdbc:initialize-database>

There are no cleanup scripts (no entries with execution="DESTROY"), yet the DataSourceInitializer bean tries to open a database connection when the context is shutting down. This slows down the shutdown process, especially when the connection times out.

The source code of DataSourceInitializer contains a null check on this.databaseCleaner:

    @Override
    public void destroy() {
        execute(this.databaseCleaner);
    }

    private void execute(DatabasePopulator populator) {
        Assert.state(this.dataSource != null, "DataSource must be set");
        if (this.enabled && populator != null) {
            DatabasePopulatorUtils.execute(populator, this.dataSource);
        }
    }

However, DatabasePopulatorConfigUtils.setDatabasePopulator always creates a non-null value for databaseCleaner, even if the object is effectively a no-op.

The problem happens in spring-jdbc 4.3.14 and 5.1.7