2009-09-21 3 views
5

Ich habe eine groovige Anwendung, die eine Oracle DB als DataSource verwendet.Groovy: Wie man auf die bereits in DataSource gesetzten Werte zugreift

In DataSource.groovy I festgelegt haben:

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

Für einige Performance-Gründen an einigen Punkten bin ich accesing die DB SQL auf folgende Weise mit:

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

Das heißt, Benutzername und Passwort werden in der Anwendung zweimal verdrahtet. Meine Frage ist, ob es möglich ist, in meiner Anwendung die Attribute username und password zu adressieren, die bereits in der DataSource.groovy festgelegt sind.

Vielen Dank im Voraus,

Luis

+1

versuchen def myDataSource = ConfigurationHolder.config.dataSource? –

Antwort

10

die Lösung besteht darin, einige Importe

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

und die fo hinzufügen lowing code:

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

Entschuldigung für meine annoing :) aber was ist mit def sql = neue Sql (ConfigurationHolder.config.dataSource als DataSource) Wenn es funktioniert, ist es besser als newInstance, weil Sie Verbindung über DataSource-Klasse erhalten, die in der Regel gepoolten und besser konfiguriert ist. –

+1

def sql = new Sql (ConfigurationHolder.config.dataSource als DataSource) funktioniert nicht. Wir erhalten eine MAP mit allen Datenquelleninformationen, Argumente, die nicht mit der neuen Sql übereinstimmen. Lösung hinzufügen von Luixv funktioniert, danke! –

+0

Ab Grails 2.0 ist 'ConfigurationHolder' veraltet. Stattdessen injizieren Sie 'grailsApplication'-Objekt und verwenden Sie dann' grailsApplication.config.dataSource. * ' – andysh

0

Kann nicht Sie nur die folgenden? (Das Datasource unter der Annahme ist eine Variable in Umfang)

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

dataSource ist keine Variable im Bereich dieser Seite. – Luixv

1

Sie SQL-Klasse von Datenquellen erstellen können zum Beispiel

def sql = new Sql(myDataSource) 

wo MyDatasource - Objekt der Klasse Datasource (Sie DS in Datasource erklärt bekommen .groovy)

+0

Danke für deine Antwort. Können Sie mir bitte sagen, wie Sie "myDataSource" definieren? In der Tat eine DataSource.groovy Ich habe bereits eine dataSource definiert. Meine Frage ist, wie man auf diese Variable zugreifen kann. Vielen Dank im Voraus! Luis – Luixv

+0

Ich versuche es nicht selbst. versuch def myDataSource = ConfigurationHolder.config.dataSource, gib mir zurück, wenn es ok ist, ich bin richtig die Antwort –

+0

Leider löst dein Vorschlag eine Ausnahme aus: org.codehouse.groovy.runtime.metaclass.MethodSelectionException: Konnte nicht welche finden Methode () aus dieser Liste aufrufen: public groovy.sql.Sql # (javax.sql.DataSource) öffentliche groovy.sql.Sql # (groovy.sql.Sql) öffentliche groovy.sql.Sql # (Java .sql.Connection) Wie auch immer, keine Sorge. Ich habe eine Lösung in Ihrem Vorschlag basiert. Vielen Dank! – Luixv

Verwandte Themen