Источник данных JNDI для оракула с Граалсом 1.3 - PullRequest
1 голос
/ 18 ноября 2010

Я не могу запустить свой источник данных 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.

Есть идеи, как заставить это работать?

Thx


Edit:

Работает отлично! 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"/>

In DataSource.groovy

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

Edit:

Странная вещь, если вы используете источник данных в качестве глобального ресурса. Конфигурация, которая работает для меня:

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

2 голосов
/ 18 ноября 2010

Префикс JNDI java:comp/env/ для Tomcat , поэтому в вашем случае он

jndiName = "java:comp/env/mydatasource"

в DataSource.groovy .

Для справки: Документы Grails .


Редактировать: В вашем Config.groovy также отсутствует свойство driverClassName думаю это

driverClassName: "oracle.jdbc.driver.OracleDriver",
1 голос
/ 20 июня 2012

У меня была такая же проблема.Мне нужно было работать 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'
}
...