我正在开发一个必须访问多个数据源的 Grails 应用程序。数据源在默认数据库中定义(即它们存储在那里,我必须调用默认数据库以检索我必须准备连接到的数据源名称列表)。当服务器启动时,我检索数据库列表,创建数据源 bean 并注入它们。所有动态添加的数据库在结构上都是相同的(即具有相同的表和域对象结构)。
这个问题是我最接近一段有用的代码,但这并不是我所需要的。
问题 #1
- 当我注册数据源 bean 时,它们会显示在我期望的位置,但 Grails 不会选择它们。
这就是我添加它们的方式:
// Register datasource bean
def beanName = 'dataSource_devDB1'
BeanBuilder bb = new BeanBuilder()
bb.beans {
"${beanName}"(BasicDataSource) {
url = "jdbc:h2:devDB1Db;MVCC=TRUE"
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
}
bb.registerBeans(grailsApplication.mainContext)
// check that it registered
def ctx = grailsApplication.mainContext
def ctxlist = ctx2.beanDefinitionNames.findAll{it.contains( 'dataSource' )}
log.info "ctxlist = " + ctxlist
这打印:
[dataSource, dataSourceUnproxied, dataSource_devDB1]
当我这样做时,我可以对默认数据源执行操作,仅此而已。
问题 #2
- 如果我将所有数据源声明为
Datasource.groovy
文件的一部分,那么我可以对所有数据库执行操作,但不像文档所宣传的那样
如果我对我的域对象进行静态映射,它会起作用:
static mapping = {datasources(['devDB1', 'devDB2', 'DEFAULT')] or datasource = 'ALL'
但我想要的是将所有这些作为服务的一部分执行,并声明我的域对象使用所有数据源。
在服务中声明数据源不起作用:
class secureDBService{
static datasource = "devDB1"
def readWriteMethod(){
.....
// this always uses the default datasource ignoring the static property above.
// the only time it uses devDB1 is if I declare it as part of the domain datasource
// mapping
}
}
无论如何,这将始终使用默认数据源。它使用正确数据源的唯一时间是在域对象上我列出有问题的数据源。
那么,有没有人:
尝试添加动态数据源并成功?
使用 grails 服务在数据源之间切换?
(这将是一个非常棒的额外内容,作为“顶部的樱桃”)成功使用多个数据源和 Spring 安全核心?如何切换安全插件的数据源?
谢谢
--