我想根据应用程序启动时传递的参数连接到不同的数据库,我打算传递像
这样的参数grails run-app -Ddbsource.name=db_one
因此,在这种情况下,Datasource.groovy应该如下所示
dataSource {
pooled = true
driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
dialect = "org.hibernate.dialect.SQLServerDialect"
dbCreate = "update"
username = "username"
password = "password"
url = "jdbc:sqlserver://DEV-SVR;databaseName=db_one"
}
它也应该适用于WAR,我打算以与此相同的方式传递参数
grails war -Ddbsource.name=db_one
无论如何要实现这个目标吗?
答案 0 :(得分:0)
试试这样。
命令:
grails run-app -Ddbname=db_one
代码:
dataSource {
pooled = true
driverClassName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
dialect = "org.hibernate.dialect.SQLServerDialect"
dbCreate = "update"
username = "username"
password = "password"
url = "jdbc:sqlserver://DEV-SVR;databaseName=${System.getenv('dbname')}"
}
答案 1 :(得分:0)
我发现最好的解决方案是外部化配置。 您可以通过正确设置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.properties'或者&& 396./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"]