Grails 3 服务中的多个数据源?

Multiple datasources in Grails 3 service?

我正在将应用程序从 Grails 2 升级到 Grails 3。在应用程序中,我有一个 Grails 服务,我需要根据 url 参数选择数据源。所以我在 Grails 2 中的设置看起来有点像这样(伪代码):

application.yml:

development:
    dataSource_1_a
    dataSource_2_a
    dataSource_2_b
test:
    dataSource_1_a
    dataSource_2_a
    dataSource_2_b

FooService.groovy:

Sql getSqlInterface(Environment env) {
    switch(env){
        case Environment.A:
            return new Sql(dataSource_2_a)
        case Environment.B:
            return new Sql(dataSource_2_b)
        default:
            throw new Exception("Invalid environment $env!")
    }
}

但是在 Grails 3 中,我还没有设法在同一个服务中使用两个数据源(在 application.yml 中有一个 dataSources 块)。如果我调用其中一个 dataSource 那么那个会起作用,但另一个不会。我知道您可以 static mapping = { datasource 'secondary' } 但这似乎也不支持多个数据源。

如您所见here您可以将多个数据源添加到您的域Class。

一个服务只能有一个数据源,但是您可以为每个数据源创建一个服务,并为管理请求创建一个服务,如下所示:

   switch(Environment env){
   case Environment.A:
        return dataSourceAService.method()
    case Environment.B:
        return dataSourceBService.method()
    default:
        throw new Exception("Invalid environment $env!")
   }

对我有用的是:

ApplicationContext context = Holders.grailsApplication.mainContext

switch (env) {
    case Environment.A:
        return new Sql((DataSource)context.getBean('dataSource_1_a'))
    case Environment.B:
        return new Sql((DataSource)context.getBean('dataSource_1_b'))
    default:
        throw new Exception("Invalid environment $env!")
}