Несколько источников данных в службе Grails 3?

Я обновляю приложение с Grails 2 до Grails 3. В приложении у меня есть служба Grails, где мне нужно выбрать источник данных на основе параметра URL. Итак, моя настройка в Grails 2 выглядит примерно так (псевдокод):

application.yml:

development:
    dataSource_1_a
    dataSource
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!")
    }
}
a dataSource
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!")
    }
}
b test: dataSource_1_a dataSource
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!")
    }
}
a dataSource
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!")
    }
}
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 мне еще не удалось использовать два источника данных в одном сервисе (с блоком dataSources в application.yml). Если я назову один из них dataSource, то он будет работать, а другой нет. Я знаю, что вы можете сделать static mapping = { datasource 'secondary' }, но это также не поддерживает несколько источников данных.


person madde    schedule 28.06.2015    source источник
comment
В заголовке вашего поста говорится о Grails 3, но в вопросе вы ссылаетесь на Grails 2. Возможно, вы захотите это уточнить.   -  person IcedDante    schedule 07.12.2015
comment
Я обновил вопрос, сказав, что обновляюсь с 2 до 3. Надеюсь, теперь это более понятно.   -  person madde    schedule 10.12.2015


Ответы (2)


Как видите, здесь вы можете добавить несколько источников данных в класс вашего домена.

Служба может иметь только один источник данных, но вы можете создать службу для каждого источника данных и одну службу, которая управляет запросом, например:

   switch(Environment env){
   case Environment.A:
        return dataSourceAService.method()
    case Environment.B:
        return dataSourceBService.method()
    default:
        throw new Exception("Invalid environment $env!")
   }
person YAT    schedule 29.06.2015
comment
как указать, какая служба будет обрабатывать какой источник данных? Я попытался использовать строку ниже, но она не работает: static datasource = 'datasource2' - person Bilal Ahmed Yaseen; 19.03.2018

Что сработало для меня, так это:

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!")
}
person madde    schedule 11.08.2015