2010-11-18 54 views
1

我无法让我的JNDI数据源运行。 随后官方Grails的文档我成立了一个Config.groovy文件datasouce:JNDI数据源到oracle和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" 
      ] 
     ] 

所以,我DataSource.groovy的样子:

pooled = false 
jndiName = "mydatasource" 

我尝试了 “mydatasource” 几个不同的符号,如“ jdbc/mydatasource“或”java:comp/env/jdbc/mydatasource“。

对于每个配置,我收到此:“javax.naming.NameNotFoundException:名称...未在此上下文中绑定”。

另外,当我在tomcat 6的server.xml中设置全局资源时,部署的grails-war无法找到JNDI资源。

任何想法得到这个东西的工作?

THX


编辑:

它工作正常! Tomcat(在我的情况下是版本6)自动添加前缀“java:comp/env”到您的数据源jndi-name。 那么grails中的tomcat插件也是如此。

Grails的Config.groovy中(在我的情况下开发环境):

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" 
      ] 
     ] 

在context.xml中(在我的情况下,生产环境):

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

在DataSource.groovy的

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

编辑:

如果您使用数据源作为全局资源,这是一件奇怪的事情。 这对我的作品的配置:

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

在context.xml中

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

在DataSource.groovy中:

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

回答

2

的JNDI前缀java:comp/env/Tomcat,所以在你的情况下它是

jndiName = "java:comp/env/mydatasource" 

in DataSource.groovy

供参考:Grails Docs


编辑:您Config.groovy中也缺少driverClassName财产。我think它是

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

如果你需要保持JNDI通用(以便它可以在不修改对Tomcat或其他容器中运行)? – dbrin 2012-11-16 19:14:41

1

我有同样的问题。我需要JNDI工作。 我经历了代码,发现问题。

解决方案: 当您使用JNDI时,不要设置池值。我的意思是不要把它设置为真或假。不要给它任何价值。例如....

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

问题出在数据源0.5文件DatasourcesGrailsPlugin.groovy文件中。以下几行是问题所在。

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

解决方案(如果有人想修复插件)是

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