2009-12-13 1 views
2

У вас есть код, который выглядит так?В Grails вы можете использовать вызовы класса sql.newInstance и Domain в том же методе?

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] 
} 

Если это так, они используют разные соединения? Есть ли способ получить вызов сохраненного proc для использования того же соединения, что и вызов MyClass?

ответ

3

Они будут использовать разные соединения. Sql захватит новый, и вызов GORM будет использовать его из пула соединений, управляемого DataSource. Но вы можете получить Sql использовать такое же соединение, как вызов Горм с помощью 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

Спасибо Я дам, что попробовать. – Andrew

2

Они будут разными соединениями. Это стандартная проблема с Grails в том, что у вас может быть только один DataSource.groovy, и поэтому только один связан с GORM. Есть способы обойти это, но в основном это вопрос того, что вам нужно в то время.

Если вы хотите подключиться к совершенно другому источнику данных, вы можете настроить что-то подобное в своем Config.groovy (не совершенное, но достаточно эффективное).

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>" 
    } 
} 

Тогда в службе называют это просто так:

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) 
Смежные вопросы