我发现最好的解决方案是外部化配置。
您可以通过正确设置 DataSource.groovy 和 Config.groovy 文件轻松做到这一点。
这就是我们的(相关部分)DataSource.groovy 对于我们所有应用程序(通常部署到 JBoss 进行生产)的样子:
// environment specific settings
environments {
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop','update'
pooled = true
dialect= "org.hibernate.dialect.MySQL5InnoDBDialect"
driverClassName = "com.mysql.jdbc.Driver"
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
jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
}
// loggingSql = true
}
}
test {
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
}
}
}
production {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop','update'
dialect= "org.hibernate.dialect.MySQL5InnoDBDialect"
pooled = false
jndiName = "java:/${appName}DS"
}
}
}
通过此配置,我们将数据源设置为生产时的 JNDI 资源,将在应用服务器中进行配置,我们还为开发环境设置连接池和通用设置(驱动程序、方言)。
现在,使用 Config.groovy,您可以轻松地让应用程序从外部文件加载开发中连接的其余配置,这非常棒,因为这样每个开发人员都可以设置自己的数据库配置而无需用户/密码组合被发送到源代码控制系统。
实际上,Config.groovy 通常在顶部带有这样的东西(已注释):
grails.config.locations = [ "file:${userHome}/.grails/${appName}-config.properties",
"file:${userHome}/.grails/${appName}-config.groovy"]
因此,如果您的应用名称为“myapp”,您的用户为“max”,您的用户主页为“/Users/max”,它将尝试加载“/Users/max/.grails/myapp-config”。属性”或“/Users/max/.grails/myapp-config.groovy”。
您可以在此处设置其余所需的参数(或覆盖它们)。
示例属性文件:
dataSource.username=USERNAME
dataSource.password=PASSWORD
dataSource.url=jdbc:mysql://192.168.1.1/DATABASE?autoReconnect=true&useUnicode=true&characterEncoding=utf8"
当然,由于不同的原因(不仅仅是数据库配置),您在整个应用中可能需要其他配置属性。
我认为您可以通过使用您尝试执行的方式传递的环境变量修改给定位置来轻松调整此配置。这样你只需要设置一个环境变量。也许像:
grails.config.locations = [ "file:${userHome}/.grails/${appName}-${System.getenv( 'dbname )}-config.properties",
"file:${userHome}/.grails/${appName}-${System.getenv( 'dbname )}-config.groovy"]