Grails 2 mehrere dynamische Datenquellen in Diensten

Ich arbeite an einer Grails-Anwendung, bei der ich auf mehrere Datenquellen zugreifen muss. Die Datenquellen sind in der Standarddatenbank definiert (dh sie sind dort gespeichert, und ich muss die Standarddatenbank aufrufen, um eine Liste der Datenquellennamen abzurufen, mit denen ich eine Verbindung herstellen möchte). Wenn der Server hochfährt, rufe ich die Liste der Datenbanken ab, erstelle die Datenquellen-Beans und füge sie ein. Alle dynamisch hinzugefügten Datenbanken sind strukturell identisch (dh sie haben dieselbe Tabellen- und Domänenobjektstruktur).

Diese Frage Ich komme einem nützlichen Teil des Codes am nächsten, aber es ist nicht ganz das, was ich brauche.

Fehler 1Wenn ich die Datenquellenbeans registriere, werden sie dort angezeigt, wo ich sie erwarte, aber Grails holt sie nicht ab.

So füge ich sie hinzu:

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

Dies druckt:

[dataSource, dataSourceUnproxied, dataSource_devDB1]

Wenn ich das mache, kann ich Operationen für die Standarddatenquelle ausführen, und das wars.

Problem Nr. 2Wenn ich alle meine Datenquellen als Teil der deklariereDatasource.groovy Datei, dann kann ich Operationen für alle meine Datenbanken ausführen, aber nichtwie in der Dokumentation angegeben

Es funktioniert, wenn ich die statische Zuordnung für meine Domänenobjekte vornehme:

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

Ich möchte dies jedoch als Teil eines Dienstes ausführen und meine Domänenobjekte so deklarieren, dass sie ALLE Datenquellen verwenden.

Das Deklarieren der Datenquelle im Service funktioniert nicht:

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

Dabei wird immer die Standarddatenquelle verwendet, egal was passiert. Die einzige Zeit, in der die richtige Datenquelle verwendet wird, ist, wenn im Domänenobjekt die betreffende Datenquelle aufgelistet wird.

Hat also jemand:

hat versucht, dynamische Datenquellen hinzuzufügen, und ist dies gelungen?

Mit Grails-Diensten zwischen Datenquellen wechseln?

(und dies wäre ein fantastisches Extra, da eine "Kirsche an der Spitze") hatte Erfolg mit mehreren Datenquellen mit Federsicherheitskern? Wie wechselt man die Datenquelle für das Sicherheits-Plugin?

Vielen Dank

-

Antworten auf die Frage(3)

Ihre Antwort auf die Frage