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

Switch Gorm to different datasource at runtime

鉴于需要从多个环境(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 域 class:

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
}

在上述域 class 中,数据源被硬编码为环境特定数据源之一(prodA 或 prodB 甚至其他环境)。

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

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

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

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

或者使该域对所有数据源可用,例如

static mapping = {
    datasources 'ALL'
 }

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

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

参考。 multipleDatasources