【问题标题】:Connect to database depending upon arguments passed根据传递的参数连接到数据库
【发布时间】:2016-04-27 06:41:38
【问题描述】:

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

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

有没有办法做到这一点?

【问题讨论】:

    标签: grails datasource


    【解决方案1】:

    试试这样。

    命令:

    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')}"
    }
    

    【讨论】:

    • 对不起,我应该更具体一些。我需要它来运行应用程序以及所有环境的战争。
    【解决方案2】:

    我发现最好的解决方案是外部化配置。 您可以通过正确设置 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"]
    

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 2011-12-26
      相关资源
      最近更新 更多