问题
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