【问题标题】:Cannot Configure Grails 3 Multiple Data Sources无法配置 Grails 3 多个数据源
【发布时间】:2016-01-23 02:23:31
【问题描述】:

我最近尝试创建一个应用程序,允许我比较 3 个独立数据库的值。数据库是 3 个 Oracle 实例,它们(本质上)包含相同的数据库,但在 DEV/TEST/PROD 设置中。

我想做的是在 GRAILS 3 中创建一个域类。然后我希望能够获取该域类映射到的记录,但对所有 3 个环境都执行此操作。

从阅读 Grails 3 文档看来,这应该可以通过在 application.yml 中定义 3 个数据源来实现(在我的示例中,我在这里定义了 4 个):

dataSources:
    dataSource:
        pooled: true
        jmxExport: true
        logSql: true
        driverClassName: oracle.jdbc.OracleDriver
        username: MYUSER
        password: Password1
        dbCreate: validate
        url: jdbc:oracle:thin:@someserver:1521:DEV1
    dataSource1:
        pooled: true
        jmxExport: true
        logSql: true
        driverClassName: oracle.jdbc.OracleDriver
        username: MYUSER
        password: Password1
        dbCreate: validate
        url: jdbc:oracle:thin:@someserver:1521:DEV1
    dataSource2:
        pooled: true
        jmxExport: true
        logSql: true
        driverClassName: oracle.jdbc.OracleDriver
        username: MYUSER
        password: Password1
        dbCreate: validate
        url: jdbc:oracle:thin:@someserver:1521:TEST1
    dataSource3:
        pooled: true
        jmxExport: true
        logSql: true
        driverClassName: oracle.jdbc.OracleDriver
        username: MYUSER
        password: Password1
        dbCreate: validate
        url: jdbc:oracle:thin:@someserver:1521:PROD1

然后在域类的映射中指定映射中的数据源:

package plsutils

class DmjTypes {
    String code
    String description
    Date insertDate
    String insertUser
    Date modifyDate
    String modifyUser

    String dbEnv

    static mapping = {
        datasources(['dataSource1', 'dataSource2', 'dataSource3'])

        version false
        table name: "CDE_DMJ_TYPES", schema: "MYSCHEMA"

        id generator: 'sequence' ,params:[sequence: 'DMJTY_SEQ']

        columns {
            id column: "DMJTY_ID"
            code column: "DMJTY_CDE"
            description column: "DMJTY_DESCR"
            insertDate column: "INSERT_DTT"
            insertUser column: "INSERT_USER"
            modifyDate column: "MODIFY_DTT"
            modifyUser column: "MODIFY_USER"
            dbEnv formula:'( select inst.instance_name || \'-\' ||     inst.host_name from v$instance inst ) '
        }

    }
}

然后,在我的控制器中,我应该能够执行以下操作:

params.max = Math.min(max ?: 10, 100)
dmjTypesListDev = DmjTypes.dataSource1.list(params)
dmjTypesListTest = DmjTypes.dataSource2.list(params)
dmjTypesListProd = DmjTypes.dataSource3.list(params)

我在第一次调用时遇到错误:

URI /dmjTypes/index
Class groovy.lang.MissingPropertyException
Message null
Caused by No such property: dataSource1 for class: plsutils.DmjTypes

我正在使用 ojdbc7.jar,连接到 Oracle 11g,我正在使用 Grails 3.0.9。

我不禁认为我在某个地方做了一些非常愚蠢的事情。谁能帮我解决这个问题?

干杯, 艾伦

【问题讨论】:

  • 嗨,你解决了这个问题吗?
  • 是的,我确定上面的代码似乎可以工作。问题是我最近升级了我正在使用的 grails 版本。由于与列出 grails 版本的现有配置文件发生冲突,因此存在问题。我更新了配置文件以在 gradle.properties 文件(3.1.1)中拥有正确的 grails 版本,进行了彻底的清理和重建,它似乎可以工作。这里的教训是在升级 grails 版本时要小心,即使是次要版本。

标签: grails grails-orm


【解决方案1】:

基于official documantation尝试dataSources关键字:

dataSources:
    dataSource:
        pooled: true
        jmxExport: true
        driverClassName: org.h2.Driver
        username: sa
        password:
    lookup:
        dialect: org.hibernate.dialect.MySQLInnoDBDialect
        driverClassName: com.mysql.jdbc.Driver
        username: lookup
        password: secret
        url: jdbc:mysql://localhost/lookup
        dbCreate: update

environments:
    development:
        dataSources:
            dataSource:
                dbCreate: create-drop
                url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
    test:
        dataSources:
            dataSource:
                dbCreate: update
                url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
    production:
        dataSources:
            dataSource:
                dbCreate: update
                url: jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
                properties:
                   jmxEnabled: true
                   initialSize: 5
                   …
            lookup:
                dialect: org.hibernate.dialect.Oracle10gDialect
                driverClassName: oracle.jdbc.driver.OracleDriver
                username: lookup
                password: secret
                url: jdbc:oracle:thin:@localhost:1521:lookup
                dbCreate: update

【讨论】:

    【解决方案2】:

    一旦我更正了 gradle.properties 中提到的 grails 版本并执行了完整的清理和重建,我就能让它工作。我相信我所有的问题都是因为我用来构建它的 grails 的版本不匹配。

    所以,这是适当的数据源条目:

    dataSources:
        dataSource:
            pooled: true
            jmxExport: true
            driverClassName: oracle.jdbc.OracleDriver
            username: MYUSER
            password: Password1
            dbCreate: validate
            url: jdbc:oracle:thin:@somelocalserver:1521:LOCAL
        one:
            pooled: true
            jmxExport: true
            driverClassName: oracle.jdbc.OracleDriver
            username: MYUSER
            password: Password1
            dbCreate: validate
            url: jdbc:oracle:thin:@somedevserver:1521:DEV1
        two:
            pooled: true
            jmxExport: true
            driverClassName: oracle.jdbc.OracleDriver
            username: MYUSER
            password: Password1
            dbCreate: validate
            url: jdbc:oracle:thin:@sometestserver:1521:TEST1
        three:
            pooled: true
            jmxExport: true
            driverClassName: oracle.jdbc.OracleDriver
            username: MYUSER
            password: Password1
            dbCreate: validate
            url: jdbc:oracle:thin:@someproductionserver:1523:PROD1
    

    这是工作域类:

    class DmjTypes {
        String code
        String description
        Date insertDate
        String insertUser
        Date modifyDate
        String modifyUser
    
        String dbEnv
    
        static mapping = {
            datasources(['one', 'two', 'three'])
    
            version false
            table name: "CDE_DMJ_TYPES", schema: "MYSCHEMA"
    
            id generator: 'sequence' ,params:[sequence: 'DMJTY_SEQ']
    
            columns {
                id column: "DMJTY_ID"
                code column: "DMJTY_CDE"
                description column: "DMJTY_DESCR"
                insertDate column: "INSERT_DTT"
                insertUser column: "INSERT_USER"
                modifyDate column: "MODIFY_DTT"
                modifyUser column: "MODIFY_USER"
                dbEnv formula:'( select inst.instance_name || \'-\' ||     inst.host_name from v$instance inst ) '
            }
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      dataSources:
          dataSource:
              pooled: true
              jmxExport: true
              logSql: true
              driverClassName: oracle.jdbc.driver.OracleDriver        
              username: MYUSER
              password: Password1
              dbCreate: validate
              autoReconnect: true
              #url: jdbc:oracle:thin:@someserver:1521:DEV1(I remember in 3.0.9 this is under environments:development:dataSources:dataSource)
          dataSource2:
              pooled: true
              jmxExport: true
              logSql: true
              driverClassName: oracle.jdbc.driver.OracleDriver
              dialect: org.hibernate.dialect.OracleDialect
              username: MYUSER
              password: Password1
              dbCreate: validate
              url: jdbc:oracle:thin:@someserver:1521:TEST1
              autoReconnect: true
          dataSource3:
              pooled: true
              jmxExport: true
              logSql: true
              driverClassName: oracle.jdbc.driver.OracleDriver
              dialect: org.hibernate.dialect.OracleDialect
              username: MYUSER
              password: Password1
              dbCreate: validate
              url: jdbc:oracle:thin:@someserver:1521:PROD1
              autoReconnect: true
      

      在控制器中:

      static mapping = {
              datasources(['dataSource', 'dataSource2', 'dataSource3'])
              .....
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 2018-04-10
        相关资源
        最近更新 更多