在Grails中你可以在同一个方法中同时使用sql.newInstance和Domain类调用吗?

时间:2009-12-13 02:58:24

标签: sql grails groovy connection

你能拥有这样的代码吗?

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

如果是这样,他们使用不同的连接?有没有办法让对存储过程的调用使用与MyClass调用相同的连接?

3 个答案:

答案 0 :(得分:3)

他们将使用不同的连接。 Sql将获取一个新的,GORM调用将使用DataSource管理的连接池中的一个。但是你可以使用sessionFactory.currentSession.connection()让Sql使用与GORM调用相同的连接:

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

答案 1 :(得分:2)

他们将是不同的联系。这是Grails的标准问题,因为您只能有一个DataSource.groovy,因此只有一个链接到GORM。有很多方法可以解决这个问题,但这主要取决于你当时的需求。

如果你想连接到一个完全不同的DataSource,你可以在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)

答案 2 :(得分:0)