JNDI источник данных для оракула с Граалсом 1.3
Я не могу запустить мой источник данных JNDI. Следуя официальному документу Grails, я создал базу данных в 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 ... не связан в этом контексте".
Также, когда я настраивал глобальный ресурс в файле server.xml моего tomcat 6, развернутая grails-war не может найти ресурс JNDI.
Любые идеи, чтобы заставить этот материал работать?
Спасибо
Редактировать:
Работает нормально! Tomcat (в моем случае версия 6) автоматически добавляет префикс "java:comp/env" к вашему jndi-имени источника данных. Так же как и плагин для котов в Grails.
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"
в DataSource.groovy.
Для справки: Grails Docs.
Изменить: ваш Config.groovy также отсутствует driverClassName
имущество. Я думаю это
driverClassName: "oracle.jdbc.driver.OracleDriver",
У меня такая же проблема. Мне нужно, чтобы 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'
}
}
}
Проблема в файле datasources 0.5 файла DatasourcesGrailsPlugin.groovy. следующие строки являются проблемой.
if (ds.pooled)
{
dsBean.destroyMethod = 'close'
}
Решение (если кто-то хочет исправить плагин)
if (ds.pooled && !ds.jndiName)
{
dsBean.destroyMethod = 'close'
}