2009-09-21 12 views
5

Ho un'applicazione groovy che utilizza un DB Oracle come origine dati.Groovy: Come accedere ai valori già impostati in DataSource

In DataSource.groovy ho impostato:

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

Per alcuni motivi di prestazioni in alcuni punti mi accesing DB utilizzando SQL nel seguente modo:

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

Cioè, nome utente e la password sono cablate due volte nell'applicazione. La mia domanda è se è possibile indirizzare nella mia applicazione agli attributi nome utente e password già impostati in DataSource.groovy.

Grazie in anticipo,

Luis

+1

try def myDataSource = ConfigurationHolder.config.dataSource? –

risposta

10

la soluzione è quella di aggiungere un po 'le importazioni

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

e fO codice seguente:

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

Scusate per il mio fastidio :) ma per quanto riguarda def sql = new Sql (ConfigurationHolder.config.dataSource as DataSource) Se funziona è meglio di newInstance perché si ottiene la connessione tramite la classe DataSource che di solito è raggruppata e meglio configurata. –

+1

def sql = new Sql (ConfigurationHolder.config.dataSource as DataSource) non funziona. Otteniamo una MAP con tutte le informazioni sui dati, argomenti non corrispondenti al nuovo Sql. Soluzione aggiunta da Luixv funziona, grazie! –

+0

A partire da Grails 2.0, 'ConfigurationHolder' è deprecato. Invece, iniettare l'oggetto 'grailsApplication' e quindi usare' grailsApplication.config.dataSource. * ' – andysh

0

Non puoi semplicemente effettuare le seguenti operazioni? (Assumendo che dataSource è una variabile di portata)

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

dataSource non è una variabile nell'ambito di questa pagina. – Luixv

1

È possibile creare classe Sql da origine dati, ad esempio

def sql = new Sql(myDataSource) 

dove MyDataSource - oggetto della classe DataSource (è possibile ottenere il vostro DS dichiarato nel DataSource .groovy)

+0

Grazie per la risposta. Potresti dirmi come definire "myDataSource". In effetti un DataSource.groovy ho già definito un dataSource. La mia domanda è come accedere a questa variabile. Grazie in anticipo! Luis – Luixv

+0

Io non ci provo. prova def myDataSource = ConfigurationHolder.config.dataSource, restituiscimi se ok, sono corretto la risposta –

+0

Sfortunatamente la tua proposta lancia un'eccezione: org.codehaus.groovy.runtime.metaclass.MethodSelectionException: Impossibile trovare quale metodo () per richiamare da questo elenco: public groovy.sql.Sql # (javax.sql.DataSource) public groovy.sql.Sql # (groovy.sql.Sql) public groovy.sql.Sql # (java .sql.Connection) Ad ogni modo non preoccuparti. Ho una soluzione basata sulla tua proposta. Grazie! – Luixv

Problemi correlati