Grails 3.x多个数据源

时间:2016-05-05 22:43:32

标签: grails datasource

回到Grails 2.x世界,我可以在一个环境中创建多个dataSource:

development {
    dataSource {
        ...
    }
    dataSource_new {
        ...
    }
}

并在控制器中引用它们:

def db = new SQL(dataSource_new)

一切都很棒。在Grails 3.x中,一切都不是很棒:

development:
    dataSource:
        ...
    dataSource_new:
        ...

并致电

def db = new SQL(dataSource_new)

抛出:

Ambiguous method overloading for method groovy.sql.Sql#

任何人都有这方面的成功(或者可以指出我错过了什么改变了)?

尝试在域中进行映射而没有运气:

class abc {
    String ...

    static mapping = {
        datasource: ['DEFAULT', 'dataSource_new']
}

抛出:

Ambiguous method overloading for method groovy.sql.Sql#<init>. Cannot resolve which method to invoke for [null] due to overlapping prototypes between: [interface java.sql.Connection] [interface javax.sql.DataSource]

2 个答案:

答案 0 :(得分:0)

在官方文档中,您可以找到将数据源注入服务的示例:

https://grails.github.io/grails-doc/latest/guide/single.html#multipleDatasources

class DataService {
    static datasource = 'lookup'

    void someMethod(...) {
        //…
    }
}

或进入命令:

http://grails.github.io/grails-doc/latest/guide/upgrading.html

import grails.dev.commands.*
import javax.sql.*
import groovy.sql.*
import org.springframework.beans.factory.annotation.*

class RunQueryCommand implements ApplicationCommand {

    @Autowired
    DataSource dataSource

    boolean handle(ExecutionContext ctx) {
        def sql = new Sql(dataSource)
        println sql.executeQuery("select * from foo")
        return true
    }
}

此外,请查看此主题并引用示例:https://github.com/grails/grails-core/issues/701

答案 1 :(得分:0)

我使用Grails 3.x中的乘法数据源,如下所示:

假设您有配置:

development {
  dataSources {
    dataSource {
      url = 'your_url'
      password = 'psw'
      ...
    }
    second {
      url = 'you_url_2'
      password = 'psw2'
      ...
    }
}

因此,在服务中,您将映射数据源,如下所示: dataSource_second

要创建Sql实例,您需要执行以下操作:

def sql = new Sql(dataSource_second)

它适用于Grails 3.0.11。 希望它会有所帮助。