Grails 2服务中的多个动态数据源

Kyl*_*yle 12 grails datasource

我正在使用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
Run Code Online (Sandbox Code Playgroud)

这打印:

[dataSource, dataSourceUnproxied, dataSource_devDB1]
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我可以对默认数据源执行操作,就是这样.

问题#2

  • 如果我将所有数据源声明为Datasource.groovy文件的一部分,那么我可以在所有数据库上执行操作,但不能像文档中所宣传的那样

如果我在域对象上执行静态映射,它可以工作:

static mapping = {datasources(['devDB1', 'devDB2', 'DEFAULT')] or datasource = 'ALL'
Run Code Online (Sandbox Code Playgroud)

但我想要的是作为服务的一部分执行所有这些,并声明我的域对象使用所有数据源.

声明服务中的数据源不起作用:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,这将始终使用默认数据源.它使用正确数据源的唯一时间是在域对象上我列出了有问题的数据源.


那么,有没有人:

  1. 尝试添加动态数据源并成功了吗?

  2. 使用grails服务在数据源之间切换?

  3. (这将是一个非常棒的额外,作为"樱桃在上面")成功使用多个数据源与弹簧安全核心?如何切换安全插件的数据源?

谢谢

-

Sau*_*xit 0

您可以在单个应用程序中添加多个数据源,并在服务中访问它们。

首先需要在resources.groovy中添加基本数据源。

首先导入BasicDataSource

import org.apache.commons.dbcp.BasicDataSource;
Run Code Online (Sandbox Code Playgroud)

然后

    switch (grails.util.GrailsUtil.environment) {
    case "development":
        firstDataSource( BasicDataSource ) {
            driverClassName = "net.sourceforge.jtds.jdbc.Driver"
            url = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=<Db_name>"
            username = "sa"
            password = "root"
            String SqlServerInstance = "SQLEXPRESS";
            url = url + ";" + SqlServerInstance;
        }
        break

    case "test":
        firstDataSource( BasicDataSource ) {

            driverClassName = "net.sourceforge.jtds.jdbc.Driver"
            url = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=<Db_name>"
            username = "sa"
            password = "root"
            String SqlServerInstance = "SQLEXPRESS";
            url = url + ";" + SqlServerInstance;            }
        break;

}
Run Code Online (Sandbox Code Playgroud)

以同样的方式,您可以添加更多数据源,上面的代码将为您提供除默认数据源之外的多一个数据源可供访问。我使用 switch 为不同的环境配置相同的数据源,同样可以添加更多数据源。

并且在服务中可以通过以下方式在服务中访问它:

BasicDataSource firstDataSource;
Connection con = firstDataSource.getConnection();
Run Code Online (Sandbox Code Playgroud)

然后就可以使用连接对象了。

我认为应该有帮助