回到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]
答案 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。 希望它会有所帮助。