我无法运行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"
答案 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'
}