2009-09-21 21 views
5

Tengo una aplicación maravillosa que está utilizando una base de datos Oracle como DataSource.Groovy: Cómo acceder a los valores ya establecidos en DataSource

En DataSource.groovy He configurado:

dataSource { 
pooled = true 
driverClassName = "oracle.jdbc.driver.OracleDriver" 
username = "scott" 
password = "tiger 
//loggingSql = true 
} 

Para algunas razones de rendimiento en algunos puntos estoy accediendo la base de datos utilizando SQL de la siguiente manera:

def sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", "scott", "tiger", "oracle.jdbc.driver.OracleDriver") 

Es decir, nombre de usuario y la contraseña están cableados dos veces en la aplicación. Mi pregunta es si es posible abordar en mi aplicación los atributos nombre de usuario y contraseña ya establecidos en DataSource.groovy.

Gracias de antemano,

Luis

+1

try def myDataSource = ConfigurationHolder.config.dataSource? –

Respuesta

10

la solución es añadir algunas importaciones

import javax.sql.DataSource 
import groovy.sql.Sql 
import org.codehaus.groovy.grails.commons.ConfigurationHolder 

y la fo Código de encendido:

def _url  = ConfigurationHolder.config.dataSource.url 
def _username = ConfigurationHolder.config.dataSource.username 
def _password = ConfigurationHolder.config.dataSource.password 
def _driver = ConfigurationHolder.config.dataSource.driverClassName 
def sql = Sql.newInstance(_url, _username, _password, _driver) 

def query = "<your SQL query>" 
sql.eachRow(query){ 
    println "ID: " + it.id // Whatever you need 
} 
+0

Disculpa mi molestia :) pero ¿qué pasa con def sql = new Sql (ConfigurationHolder.config.dataSource como DataSource) Si funciona, es mejor que nuevoInstance porque obtienes la conexión a través de la clase DataSource que normalmente se combina y se configura mejor. –

+1

def sql = new Sql (ConfigurationHolder.config.dataSource como DataSource) no funciona. Obtenemos un MAP con todas las informaciones de dataSource, los argumentos no coinciden con los nuevos Sql. Solución agregada por Luixv funciona, gracias! –

+0

A partir de Grails 2.0, 'ConfigurationHolder' está en desuso. En su lugar, inyecte el objeto 'grailsApplication' y luego use' grailsApplication.config.dataSource. * ' – andysh

0

¿No puedes hacer lo siguiente? (Suponiendo que dataSource es una variable de alcance)

def sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", dataSource.username, dataSource.password, dataSource.driverClassName) 
+0

dataSource no es una variable en el alcance de esta página. – Luixv

1

Puede crear clases SQL fuente de datos, por ejemplo

def sql = new Sql(myDataSource) 

donde myDataSource - objeto de origen de datos de clase (se puede obtener su DS declaró en la fuente de datos .groovy)

+0

Gracias por su respuesta. ¿Podría decirme cómo definir "myDataSource"? De hecho, un DataSource.groovy ya he definido un dataSource. Mi pregunta es cómo acceder a esta variable. ¡Gracias de antemano! Luis – Luixv

+0

No me probé. intente def myDataSource = ConfigurationHolder.config.dataSource, devuélvame si está bien, ellos estoy en la respuesta correcta –

+0

Desafortunadamente su propuesta arroja una excepción: org.codehaus.groovy.runtime.metaclass.MethodSelectionException: No se pudo encontrar cuál método () para invocar de esta lista: public groovy.sql.Sql # (javax.sql.DataSource) public groovy.sql.Sql # (groovy.sql.Sql) public groovy.sql.Sql # (java .sql.Connection) De todos modos, no te preocupes. Tengo una solución basada en tu propuesta. ¡Gracias! – Luixv

Cuestiones relacionadas