JNDI数据源到带有grails 1.3的oracle

时间:2010-11-18 11:49:00

标签: oracle grails jndi

我无法运行JNDI数据源。 遵循官方grails doc我在Config.groovy中设置了一个数据:

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:Name ...未绑定在此Context中。”

当我在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 个答案:

答案 0 :(得分:2)

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

jndiName = "java:comp/env/mydatasource"
DataSource.groovy 中的

供参考:Grails Docs


修改:您的 Config.groovy 也缺少driverClassName属性。我think

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

答案 1 :(得分:1)

我遇到了同样的问题。我需要JNDI工作。 我查看了代码,发现了问题。

解决方案: 使用JNDI时,请勿设置池值。我的意思是不要将其设置为true或false。不要给它任何价值。例如....

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