【问题标题】:Extending multiple grails DataSources in DataSources.groovy?在 DataSources.groovy 中扩展多个 grails 数据源?
【发布时间】:2011-07-16 22:55:35
【问题描述】:

您在DataSource.groovy 中定义的每个环境都扩展了位于文件根部的基本dataSource 定义,位于环境之外。

我有两个特定的配置,我需要将它们应用到许多不同的环境中,这些环境具有特定于环境的微小变化。真的,我需要两个“基本定义”,或者扩展现有定义的某种方式。

我该如何做我想做的事?

dataSource1 {
    dbCreate = "update"
    dialect = org.hibernate.dialect.Oracle10gDialect
    pooled = false
    jndiName = "java:something"
}
dataSource2 {
            pooled = true
            driverClassName = "org.hsqldb.jdbcDriver"
            username = "sa"
            password = ""
            dbCreate = "update"
            url = "jdbc:hsqldb:mem:testDb"
}

// environment specific settings
environments {
    //extend datasource1
    production{
    }
    //extend datasource2
    development{
    }
}

【问题讨论】:

    标签: grails groovy datasource


    【解决方案1】:

    dataSource 闭包可以存在于 environemnts 闭包中...

    environments {
       production {
          dataSource {
             dbCreate = "update"
             dialect = org.hibernate.dialect.Oracle10gDialect
             pooled = false
             jndiName = "java:something"
          }
       }
    }
    

    【讨论】:

    • 那你可能解释的不够清楚?我做了一个尝试。感谢您的反对。
    【解决方案2】:

    下面将为 dataSource1 和 dataSource2 分配一个闭包(注意 =),然后您可以在您的环境块中调用它们。

    dataSource1 = {
        dbCreate = "update"
        driverClassName = "org.hsqldb.jdbcDriver"
        dialect = org.hibernate.dialect.Oracle10gDialect
        pooled = false
        jndiName = "java:something"
    }
    
    dataSource2 = {
                pooled = true
                driverClassName = "org.hsqldb.jdbcDriver"
                username = "sa"
                password = ""
                dbCreate = "update"
                url = "jdbc:hsqldb:mem:testDb"
    }
    
    environments {
        production {
            dataSource {
                dataSource1.call()
            }
        }
        development {
            dataSource {
                dataSource2.call()
            }
        }
    }
    

    【讨论】:

    • 我实际上正试图这样做,但我想我搞砸了语法或其他东西。非常感谢!
    • 这与将 dataSource 闭包放在 env 块中有何不同?
    • @Gregg - 这是不同的,因为它使配置可重用 - 您可以使用相同的基本配置创建与 n 个不同数据库的连接
    • 很好的答案。您能否展示如何将诸如 dataSource1 之类的闭包移动到另一个文件(脚本或类)?我曾尝试将它们移动到诸如 OracleConfig 之类的类中,然后执行new OracleConfig().dataSource1.call(),但我收到诸如No such property: dbCreate for class: ... OracleConfig 之类的消息。我一直试图让这个工作几个小时,也没有找到任何解决这个问题的方法。非常感谢。
    【解决方案3】:

    您可以为 Grails 使用外部配置文件(而不是 Config.groovy)并在其中定义数据源。为此,我们可以在 Config.groovy 中编写以下代码

    if (System.properties["${appName}.config.location"]) {
        grails.config.locations = ["file:" + System.properties["${appName}.config.location"]]
    }
    

    然后在部署的环境中,定义环境变量:${appName}.config.location。该环境变量指向外部配置文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2012-07-29
      相关资源
      最近更新 更多