无法配置Grails 3多个数据源

时间:2016-01-23 02:23:32

标签: grails gorm

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

我想要做的是在GRAILS 3中创建一个Domain类。然后我希望能够获取该域类映射到的记录,但是对所有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。

我无能为力,但我认为我在某处做了一些巧妙的愚蠢行为。有人可以帮我这个吗?

干杯, 阿伦

3 个答案:

答案 0 :(得分:0)

基于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

答案 1 :(得分:0)

一旦我更正了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 ) '
        }

    }
}

答案 2 :(得分:-1)

试试这个:

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'])
        .....
}