2009-09-21 8 views
5

J'ai une application groovy qui utilise une base de données Oracle comme DataSource.Groovy: Comment accéder aux valeurs déjà définies dans DataSource

En DataSource.groovy je me suis fixé:

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

Pour des raisons de performance dans certains points que je suis accesing la DB en utilisant SQL de la manière suivante:

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

C'est, le nom d'utilisateur et le mot de passe sont câblés deux fois dans l'application. Ma question est de savoir s'il est possible d'adresser dans mon application les attributs nom d'utilisateur et mot de passe déjà définis dans DataSource.groovy.

Merci à l'avance,

Luis

+1

try def myDataSource = ConfigurationHolder.config.dataSource? –

Répondre

10

la solution est d'ajouter des importations

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

et la fo code suivant:

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

Désolé pour mon annoing :) mais qu'en est-il def sql = new Sql (ConfigurationHolder.config.dataSource en tant que DataSource) Si cela fonctionne mieux c'est newInstance car vous obtenez une connexion via la classe DataSource qui est généralement regroupée et mieux configurée. –

+1

def sql = new Sql (ConfigurationHolder.config.dataSource en tant que DataSource) ne fonctionne pas. Nous obtenons un MAP avec toutes les informations dataSource, les arguments ne correspondant pas à la nouvelle Sql. Solution ajoutée par Luixv fonctionne, merci! –

+0

À partir de Grails 2.0, 'ConfigurationHolder' est obsolète. Au lieu de cela, injectez l'objet 'grailsApplication', puis utilisez' grailsApplication.config.dataSource. '' – andysh

0

ne pouvez-vous faire juste ce qui suit? (En supposant que DataSource est une variable portée)

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

dataSource n'est pas une variable dans le champ d'application de cette page. – Luixv

1

Vous pouvez créer la classe Sql par source de données, par exemple

def sql = new Sql(myDataSource) 

où MyDataSource - objet de DataSource de classe (vous pouvez obtenir votre DS déclaré en DataSource .groovy)

+0

Merci pour votre réponse. Pourriez-vous s'il vous plaît me dire comment définir "myDataSource". En fait, un DataSource.groovy J'ai déjà défini une source de données. Ma question est de savoir comment accéder à cette variable. Merci d'avance! Luis – Luixv

+0

Je ne m'essaye pas. try def myDataSource = ConfigurationHolder.config.dataSource, redonnez-moi si c'est ok, les je suis correct la réponse –

+0

Malheureusement votre proposition a émis une exception: org.codehaus.groovy.runtime.metaclass.MethodSelectionException: Impossible de trouver lequel méthode () pour invoquer à partir de cette liste: public groovy.sql.Sql # (javax.sql.DataSource) public groovy.sql.Sql # (groovy.sql.Sql) public groovy.sql.Sql # (java .sql.Connection) De toute façon ne vous inquiétez pas. J'ai une solution basée sur votre proposition. Merci! – Luixv