2009-12-13 4 views
2

Pouvez-vous avoir du code qui ressemble à ceci?dans Grails pouvez-vous utiliser les appels de classe sql.newInstance et Domain dans la même méthode?

def methodname() 
{ 
proc = "sql to call a stored proc" 
def conn = Sql.newInstance(DB_CONN, DB_USERNAME, DB_PASSWORD, "org.postgresql.Driver") 
def result1 = conn.rows(proc) 
def result2 = MyClass.Find("from MyClass where foo='bar'") 
return [result1, result2] 
} 

Si tel est le cas, utilisent-ils des connexions différentes? Est-il possible d'appeler le proc stocké pour utiliser la même connexion que l'appel MyClass?

Répondre

3

Ils utiliseront des connexions différentes. Sql va en récupérer un nouveau et l'appel GORM en utilisera un du pool de connexions géré par DataSource. Mais vous pouvez obtenir Sql utiliser la même connexion que l'appel GORM à l'aide sessionFactory.currentSession.connection():

class MyControllerOrMyService { 

    def sessionFactory 

    def methodname() { 
     proc = "sql to call a stored proc" 
     def conn = new Sql(sessionFactory.currentSession.connection()) 
     def result1 = conn.rows(proc) 
     def result2 = MyClass.Find("from MyClass where foo='bar'") 
     return [result1, result2] 
    } 
} 
+0

Merci je vais donner qu'un essai. – Andrew

2

Ce seront des connexions différentes. C'est un problème standard avec Grails en ce sens que vous ne pouvez avoir qu'un DataSource.groovy et donc un seul lié à GORM. Il y a des façons de contourner cela, mais c'est surtout une question de ce dont vous avez besoin à ce moment-là.

Si vous vouliez vous connecter à un DataSource complètement différent, vous pourriez configurer quelque chose comme ceci dans votre Config.groovy (pas parfait mais assez efficace).

environments { 
    production { 
     grails.serverURL = "http://localhost:8080/${appName}" 
     grails.databaseDriverClassName = "oracle.jdbc.driver.OracleDriver" 
     grails.databaseURL = "jdbc:oracle:thin:@<servername>:1521:<sid>" 
     grails.databaseUsername = "<username>" 
     grails.databasePassword = "<password>" 
    } 
    development { 
     grails.serverURL = "http://localhost:8080/${appName}" 
     grails.databaseDriverClassName = "oracle.jdbc.driver.OracleDriver" 
     grails.databaseURL = "jdbc:oracle:thin:@<servername>:1521:<sid>" 
     grails.databaseUsername = "<username>" 
     grails.databasePassword = "<password>" 
    } 
    test { 
     grails.serverURL = "http://localhost:8080/${appName}" 
     grails.databaseDriverClassName = "oracle.jdbc.driver.OracleDriver" 
     grails.databaseURL = "jdbc:oracle:thin:@<servername>:1521:<sid>" 
     grails.databaseUsername = "<username>" 
     grails.databasePassword = "<password>" 
    } 
} 

Ensuite, dans votre appel de service simplement comme ceci:

import org.codehaus.groovy.grails.commons.* 


class SomeService { 

    boolean transactional = true 
    def config = ConfigurationHolder.config 

    // set up the Sql object 
    def sql = groovy.sql.Sql.newInstance(
      config.grails.databaseURL, 
      config.grails.databaseUsername, 
      config.grails.databasePassword, 
      config.grails.databaseDriverClassName) 
Questions connexes