2015-09-04 1 views
2

Je développe actuellement un plugin Grails en utilisant Grails 2.3.11 et familier en utilisant plusieurs sources de données. Mais maintenant je veux que mes objets de domaine fournis par ce plugin puissent utiliser une source de données différente (pour des raisons de performances, toutes les données peuvent être stockées dans une base de données différente). Le problème est que cette deuxième source de données est facultative, ce qui signifie que l'utilisateur peut définir une deuxième source de données dans tomcat (accessible via JNDI), mais n'a pas à le faire. C'est un point important: l'utilisateur peut définir une seconde source de données dans le conteneur de servlet et l'application Grails doit vérifier s'il existe une seconde source de données disponible!Définir la source de données optionnelle (multiple) dans Grails

Soyez plus précis: j'ai une classe de domaine:

class MyDomain { 

    static mapping = { 
     datasource('optionalDS') 
    } 
} 

Mon DataSource.groovy:

dataSource { 
    jndiName = "..." 
} 

dataSource_optionalDS { 
    jndiName = "..." 
} 

Le problème est que cela échouera si l'utilisateur n'a pas configuré le nom JNDI pour cette source de données facultative (parce qu'il est facultatif, il n'a pas à le faire).

J'ai essayé de créer une source de données délégante à la place:

class OptionalDataSource extends DelegatingDataSource { 

    ... 
    // the main purpose is to check, if the optional DS 
    // can be created using JNDI. If this fails, the default 
    // DS is used 
    setTagetDataSource(dataSource) 
    ... 

} 

Et dans mon descripteur de plugin:

def doWithSpring = { 
    dataSource_optionalDS(OptionalDataSource) { 
     // set default DS in case optional can not be created 
     dataSource = ref('dataSource') 
    } 
} 

Le problème avec cette solution est que la source de données optionalDS ne sont pas disponibles. Si je tente de lire les données, à savoir MyDomain.findAll() je reçois l'erreur suivante:

Methond on class MyDomain was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.

Je ne comprends pas pourquoi, parce que je peux définir la source de données par défaut de cette façon. Donc, ma question est: Comment puis-je définir une dataSource optionnelle dans Grails?

Répondre

2

Que diriez-vous de rechercher le JNDI dataSource dans DataSource.groovy et puis si elle existe en déclarant votre dataSource en option. Quelque chose comme suit

//default dataSource 
    dataSource { 
     jndiName = "..." 
    } 

    //optional dataSource 
    //let's first lookup the JNDI dataSource 
    def jndiDataSource 

    try { 
     jndiDataSource = InitialContext.doLookup("...") 
    } 
    catch(NamingException ne) {} 

    //now if jndiDataSource exists we can declare the optional dataSource 
    if(jndiDataSource) { 
     dataSource_optionalDS { 
      jndiName = "..." 
     } 
    } 

Je cherchais une méthode alternative pour lightwight simplement vérifier si le JNDI dataSource existe au lieu de regarder vers le haut. Mais pas de chance.

+0

C'est une bonne idée. J'ai légèrement modifié votre code, car je dois déclarer cette dataSource facultative dans mes classes de domaine. Et, si cette recherche jndi échoue, j'utiliserai le nom jndi de ma source de données par défaut pour en créer un optionnel. – Phillip