2010-11-18 16 views
1

Je n'arrive pas à faire fonctionner ma source de données JNDI. a suivi le Grails officiel doc je mis en place un datasouce dans Config.groovy:Source de données JNDI vers oracle avec grails 1.3

grails.naming.entries = [ 
      "mydatasource": [ 
       type: "javax.sql.DataSource", 
       auth: "Container", 
       description: "Development Datasource", 
       url: "jdbc:oracle:oci:@mydb", 
       username: "user", 
       password: "pass", 
       maxActive: "8", 
       maxIdle: "4" 
      ] 
     ] 

Alors, mon DataSource.groovy ressemble:

pooled = false 
jndiName = "mydatasource" 

J'ai essayé pour "mydatasource" plusieurs notations différentes comme " jdbc/mydatasource "ou" java: comp/env/jdbc/mydatasource ".

Avec chaque configuration, je reçois ceci: "javax.naming.NameNotFoundException: Name ... n'est pas lié dans ce contexte".

De même, lorsque je configure une ressource globale dans le fichier server.xml de mon tomcat 6, le grails-war déployé ne trouve pas la ressource JNDI.

Des idées pour que ça marche?

Thx


Edit:

Il fonctionne très bien! Tomcat (version 6 dans mon cas) ajoute automatiquement le préfixe "java: comp/env" à votre source de données jndi-name. Tout comme le plugin tomcat dans les grails.

Grails Config.groovy (dans mon cas pour l'environnement de développement):

grails.naming.entries = [ 
      "jdbc/mydb": [ 
       type: "javax.sql.DataSource", 
       auth: "Container", 
       description: "Development Datasource", 
          driverClassName: "oracle.jdbc.driver.OracleDriver", 
       url: "jdbc:oracle:oci:@mydb", 
       username: "user", 
       password: "pass", 
       maxActive: "8", 
       maxIdle: "4" 
      ] 
     ] 

En context.xml (dans mon cas pour l'environnement de production):

<Resource name="jdbc/mydb" auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="jdbc:oracle:oci:@mydb" 
      username="user" password="pass" maxActive="50" maxIdle="10" 
      maxWait="5000"/> 

Dans DataSource.groovy

pooled = false 
jndiName = "java:comp/env/jdbc/mydb" 

Édition:

Une chose étrange si vous utilisez la source de données comme une ressource globale. La configuration qui fonctionne pour moi:

En server.xml:

<Resource name="java:comp/env/jdbc/mydb" auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="jdbc:oracle:oci:@mydb" 
      username="user" password="pass" maxActive="50" maxIdle="10" 
      maxWait="5000"/> 

Dans context.xml

<ResourceLink name="jdbc/mydb" 
      global="java:comp/env/jdbc/mydb" 
      type="javax.sql.DataSource" /> 

En DataSource.groovy:

pooled = false 
jndiName = "java:comp/env/jdbc/mydb" 

Répondre

2

Le préfixe JNDI est java:comp/env/ pour Tomcat, donc dans votre cas c'est

jndiName = "java:comp/env/mydatasource" 

dans DataSource.groovy.

Pour la référence: Grails Docs.


Edit: Votre Config.groovy manque aussi la propriété driverClassName. I think c'est

driverClassName: "oracle.jdbc.driver.OracleDriver", 
+0

si vous avez besoin de garder le JNDI générique (pour qu'il puisse fonctionner sur Tomcat ou d'autres conteneurs sans modification)? – dbrin

1

J'ai eu le même problème. J'avais besoin que JNDI travaille. J'ai lu le code et trouvé le problème.

Solution: Lorsque vous utilisez JNDI, ne définissez pas la valeur groupée. Je ne veux pas dire vrai ou faux. Ne lui donnez aucune valeur. Par exemple ....

datasource(name: 'swapccpDb') 
{ 
    domainClasses([com.mycompany.rad.swapsccp.domain.SnapShot]) 
    dbCreate('update') 
    dialect(org.hibernate.dialect.OracleDialect) 
    jndiName("java:comp/env/jdbc/SnapShotDB") 
    //pooled(true) 
    services(['swapccpimport']) 
    environments(['development']) 
    hibernate 
    { 
    cache 
    { 
     use_second_level_cache = true 
     use_query_cache = true 
     provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider' 
    } 
    } 
} 

Le problème est dans le fichier datasources 0.5 fichier DatasourcesGrailsPlugin.groovy. les lignes suivantes sont le problème.

if (ds.pooled) 
{ 
    dsBean.destroyMethod = 'close' 
} 

La solution (Si quelqu'un veut fixer le plug-in) est

if (ds.pooled && !ds.jndiName) 
{ 
    dsBean.destroyMethod = 'close' 
}