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

Я работаю над приложением Grails, где мне нужно получить доступ к нескольким источникам данных. Источники данных определены в база данных по умолчанию (т.е. они хранятся там, и я должен сделать вызов базы данных по умолчанию, чтобы получить список имен источников данных, к которым я должен подготовиться для подключения).Когда сервер загружается, я получаю список баз данных, создаю bean-компоненты источника данных и внедряю их. Все динамически добавляемые базы данных структурно идентичны (т.е. имеют одинаковую структуру таблиц и объектов домена).

Этот вопроснаиболее близок к полезному фрагменту кода, но это не совсем то, что мне нужно.

Проблема №1

  • Когда я регистрирую bean-компоненты источника данных, они появляются там, где я ожидал, но Grails их не принимает.

Вот как я их добавляю:

// Register datasource bean
def beanName = 'dataSource_devDB1'

BeanBuilder bb = new BeanBuilder()
bb.beans {
    "${beanName}"(BasicDataSource) { 
        url = "jdbc:h2:devDB1Db;MVCC=TRUE"
        pooled = true
        driverClassName = "org.h2.Driver"
        username = "sa"
        password = ""            
    }
}

bb.registerBeans(grailsApplication.mainContext)

// check that it registered
def ctx = grailsApplication.mainContext
def ctxlist = ctx2.beanDefinitionNames.findAll{it.contains( 'dataSource' )}

log.info "ctxlist = " + ctxlist

Это печатает:

[dataSource, dataSourceUnproxied, dataSource_devDB1]

Когда я делаю это, я могу выполнять операции с источником данных по умолчанию, и все.

Проблема № 2

  • Если я объявлю все свои источники данных частью файла Datasource.groovy, я смогу выполнять операции со всеми своими базами данных, но не , как указано в документации.

Это работает, если я выполняю статическое сопоставление объектов моего домена:

static mapping = {datasources(['devDB1', 'devDB2', 'DEFAULT')] or datasource = 'ALL'

но я хочу выполнить все это как часть службы и объявить, что мои объекты домена используют ВСЕ источники данных.

Объявление источника данных в службе не работает:

class secureDBService{

  static datasource = "devDB1"

  def readWriteMethod(){
   .....
  // this always uses the default datasource ignoring the static property above.
  // the only time it uses devDB1 is if I declare it as part of the domain datasource
  // mapping
  }
}

При этом всегда будет использоваться источник данных по умолчанию, несмотря ни на что. Единственный раз, когда он использует правильный источник данных, - это если в объекте домена я перечисляю рассматриваемый источник данных.


Итак, кто-нибудь:

  1. пытался добавить динамические источники данных и преуспел?

  2. переключались между источниками данных с помощью служб Grails?

  3. (и это было бы фантастическим дополнением, как «вишенка на торте») успешно использовали несколько источников данных с ядром безопасности Spring? Как вы переключаете источник данных для плагина безопасности?

Спасибо

--

12
задан Community 23 May 2017 в 12:33
поделиться