根据传递的参数连接到数据库

时间:2016-04-27 06:41:38

标签: grails datasource

我想根据应用程序启动时传递的参数连接到不同的数据库,我打算传递像

这样的参数
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

无论如何要实现这个目标吗?

2 个答案:

答案 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"]