Grails 2 múltiplas fontes de dados dinâmicas em serviços

Eu estou trabalhando em um aplicativo Grails, onde devo acessar várias fontes de dados. As datasources são definidas no banco de dados padrão (ou seja, elas são armazenadas lá e eu devo fazer uma chamada para o banco de dados padrão para recuperar uma lista dos nomes das datasource que eu devo preparar para me conectar). Quando o servidor é inicializado, recupero a lista de bancos de dados, criei os beans de origem de dados e informo-os. Todos os bancos de dados adicionados dinamicamente são estruturalmente idênticos (ou seja, têm a mesma estrutura de tabela e objeto de domínio).

Essa questão é o mais próximo que cheguei de um trecho útil de código, mas não é bem o que eu preciso.

Problema 1Quando eu registro os beans de fonte de dados, eles aparecem onde eu espero, mas o Grails não os seleciona.

É assim que eu os adiciono:

// 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

Isso imprime:

[dataSource, dataSourceUnproxied, dataSource_devDB1]

Quando faço isso, posso executar operações na origem de dados padrão, e é isso.

Questão nº 2Se eu declarar todas as minhas origens de dados como parte doDatasource.groovy arquivo, então eu posso executar operações em todos os meus bancos de dados, mas nãocomo anunciado pela documentação

Ele funciona se eu fizer o mapeamento estático em meus objetos de domínio:

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

mas o que eu quero é executar tudo isso como parte de um serviço e declarar meus objetos de domínio para usar TODAS as fontes de dados.

Declarar a fonte de dados no serviço não está funcionando:

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
  }
}

Isso sempre usará a origem de dados padrão, não importa o quê. O único momento em que ele usa a fonte de dados correta é se no objeto de domínio eu listo a fonte de dados em questão.

Então, tem alguém:

tentou adicionar fontes de dados dinâmicas e foi bem-sucedido?

trocou entre fontes de dados usando serviços grails?

(e isso seria um extra fantástico, como uma "cereja no topo") teve sucesso usando vários datasource com núcleo de segurança de primavera? Como você muda a fonte de dados para o plugin de segurança?

obrigado

-

questionAnswers(3)

yourAnswerToTheQuestion