grailsgroovydatasourceproperties-filegrails-3.0

How to load datasource configuration from external file in grails 3.1.8?


I am writing a grails 3.1.8 application. My datasource written in application.groovy file.

I want to load datasource configuration like username,password,DB from an external file. Is there any way to do it in grails 3+ versions.

Here is my datasource configuration in application.groovy:-

hibernate {
    cache {
        queries = false
        use_second_level_cache = true
        use_query_cache = false
        region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory'
    }
}

dataSource {
    pooled = true
    jmxExport = true
    dialect = 'org.hibernate.dialect.PostgreSQLDialect'
    driverClassName = 'org.postgresql.Driver'
    username = 'postgres'
    password = 'postgres'
    properties = {
        jmxEnabled = true
        initialSize = 5
        maxActive = 50
        minIdle = 5
        maxIdle = 25
        maxWait = 10000
        maxAge = 10 * 60000
        timeBetweenEvictionRunsMillis = 5000
        minEvictableIdleTimeMillis = 60000
        validationQuery = "SELECT 1"
        validationQueryTimeout = 3
        validationInterval = 15000
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        ignoreExceptionOnPreLoad = true
        jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
        defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED // safe default
        abandonWhenPercentageFull = 100 // settings are active only when pool is full
        removeAbandonedTimeout = 120
        removeAbandoned = true
        logAbandoned = false // causes stacktrace recording overhead, use only for debugging
    }
}

environments {
    development {
        dataSource {
            dbCreate = 'update'
            url = "jdbc:postgresql://localhost:5432/testdb"
            logSql = true
        }
    }
    test {
        dataSource {
            dbCreate = 'update'
            url = "jdbc:postgresql://localhost:5432/testdb"
            logSql = true
        }
    }
    production {
        dataSource {
            dbCreate = 'update'
            url = "jdbc:postgresql://localhost:5432/testdb"
            logSql = true
        }
    }
}

Solution

  • Here is the solution that worked for me, you can try.

    This solution will work for grails 3.0+

    First of all need to add following dependency:

    compile 'org.grails.plugins:external-config:1.1.2'

    then need to create external configuration groovy file for example:

    db-config.groovy

    then need to place that config file into outside of the application directory or tomcat library. for example:

    D:\apache-tomcat-8.0.47\lib

    Then need to read config file from the application.groovy . In application.groovy need to place following line of code for each environment:

    grails.config.locations = ['file:///${catalina.home}/lib/db-config.groovy']

    or

    grails.config.locations = ['file:///D:/apache-tomcat-8.0.47/lib/db-config.groovy']

    You can use ${catalina.home} if you set the environment variable is CATALINA_HOME in your system. Other than you have to use direct path that I showed.

    So your application.groovy will be following:

    > environments {
    >      development {
    >          grails.config.locations = ['file:///${catalina.home}/lib/db-config.groovy']
    >      }
    >      production {
    >           grails.config.locations = ['file:///${catalina.home}/lib/db-config.groovy']
    >           ]
    >      }
    > }
    

    and your db-config.groovy file will contain following lines:

    >     dataSource {
    >       username = <DB_USER_NAME>
    >       password = <DB_PASSWORD>
    >       dbCreate = 'update'
    >       url = <DB_URL>
    >       logSql = true
    >     }
    

    You can use different db-config.groovy file for each environment.