在运行时将Gorm切换到不同的数据源

时间:2015-06-16 15:10:51

标签: grails gorm grails-domain-class

鉴于需要从多个环境(prodA,prodB等)获取数据,我在DataSource配置文件中创建了特定的dataSource条目。

environments {
    development {
         dataSource_prodA_oracle {
            dbCreate = "none"
            url = "jdbc:oracle:thin:@//prodA.box.url.com:1521/prodADB"
            driverClassName = "oracle.jdbc.OracleDriver"
            username = "prodA_user"
            password = "horribly_encoded_password"
            passwordEncryptionCodec = PropertiesCodec
        }
        dataSource_prodB_oracle {
            dbCreate = "none"
            url = "jdbc:oracle:thin:@//prodb.box.url.com:1521/prodBDB"
            driverClassName = "oracle.jdbc.OracleDriver"
            username = "prodB_user"
            password = "another_horribly_encoded_password"
            passwordEncryptionCodec = PropertiesCodec
        }
    }
}

Gorm Domain类:

class Foo {
    static mapping = {
        version false
        datasource 'prodA_oracle' //needs dynamic datasource behavior
        createdDate type: Date, column: 'created_date'
        id generator:'assigned', name:'fooId', type:'string'
    }
    static constraints = {
    }
    String fooId
    String region
    Date createdDate
}

在上面的域类中,datasource被硬编码到一个特定于环境的数据源(prodA或prodB甚至其他一些环境)。

在运行时,我需要使用此Domain类根据请求参数(指定环境类型(prodA vs prodB等))针对特定数据库触发findBy方法。

如何在运行时切换域类以使用特定的数据源?

1 个答案:

答案 0 :(得分:2)

您可以提供要通过此域名连接的数据源列表,例如

static mapping = {
    datasources(['lookup', 'auditing'])
}

或将此域提供给所有数据源,例如

static mapping = {
    datasources 'ALL'
 }

您可以通过在查询中提及其名称来查询任何数据源,例如

def result1 = Foo.lookup.findByFoo(foo)
def result2 = Foo.auditing.findByFoo(foo)

参考。 multipleDatasources