我正在将应用程序从Grails 2升级到Grails 3.在应用程序中,我有一个Grails服务,我需要根据url参数选择数据源。所以我在Grails 2中的设置看起来有点像这样(伪代码):
application.yml :
development:
dataSource_1_a
dataSource_2_a
dataSource_2_b
test:
dataSource_1_a
dataSource_2_a
dataSource_2_b
FooService.groovy :
Sql getSqlInterface(Environment env) {
switch(env){
case Environment.A:
return new Sql(dataSource_2_a)
case Environment.B:
return new Sql(dataSource_2_b)
default:
throw new Exception("Invalid environment $env!")
}
}
但在Grails 3中,我还没有设法在同一服务中使用两个数据源(dataSources
中有application.yml
块)。如果我打电话给其中一个dataSource
那么那个会起作用,而不是另一个起作用。我知道您可以执行static mapping = { datasource 'secondary' }
,但这似乎也不支持多个数据源。
答案 0 :(得分:1)
如您所见[{3}},您可以向域类添加多个dataSource。
服务只能有一个DataSource,但您可以为每个DataSource和一个管理请求的服务创建服务,如下所示:
switch(Environment env){
case Environment.A:
return dataSourceAService.method()
case Environment.B:
return dataSourceBService.method()
default:
throw new Exception("Invalid environment $env!")
}
答案 1 :(得分:0)
对我有用的是:
ApplicationContext context = Holders.grailsApplication.mainContext
switch (env) {
case Environment.A:
return new Sql((DataSource)context.getBean('dataSource_1_a'))
case Environment.B:
return new Sql((DataSource)context.getBean('dataSource_1_b'))
default:
throw new Exception("Invalid environment $env!")
}