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

一世执手 提交于 2020-01-04 04:34:15

问题


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
        }
    }
}

回答1:


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.




回答2:


You can load your external configuration file from file system using the following implementation.

This example defines for each environment( development / production / test) a separate path to an external config file.

 environments {
     development {
          grails.config.locations = [
                "file:///home/<CONFIG_FILE_LOCATION_DIR>/myconfig_developement.groovy" //for Unix based systems
          ]
     }
     production {
          grails.config.locations = [
                "file:///home/<CONFIG_FILE_LOCATION_DIR>/myconfig_production.groovy" // for Unix based systems
          ]
     }
}

Put your database configuration in myconfig_developement.groovy as follows:

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



回答3:


You can use this solution (that worked for me, with grails 3.1.x)

grails-app/init/Application.groovy:

class Application extends GrailsAutoConfiguration implements EnvironmentAware {
    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }

    @Override
    void setEnvironment(Environment environment) {
        def path = "/etc/grails-app-config.properties"
        def file = new File(path)

        if(file.exists()) {
            def config = new ConfigSlurper().parse(file.text)
            environment.propertySources.addFirst(new MapPropertySource(grails.util.Environment.getCurrent().name, config))
        }
    }
}

you can use environment variable for the config path:

System.getenv(ENV_CONF_FILE_VAR)

grails-app-config.properties:

dataSource.dbCreate='update'
dataSource.driverClassName='com.mysql.jdbc.Driver'
dataSource.url='jdbc:mysql://localhost:5432/testdb'
dataSource.username='user'
dataSource.password='pass'
com.test='test'
com.numTest=4



回答4:


You can use external-config Grails plugin and define the configuration in your external configuration file.

grails.config.locations = [
        "file:///etc/app/myconfig.groovy"
]

And then define datasource configuration in myconfig.groovy



来源:https://stackoverflow.com/questions/46460845/how-to-load-datasource-configuration-from-external-file-in-grails-3-1-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!