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'
}
Другие вопросы по тегам