【问题标题】:Grails - Getting data from a different datasource and saving it in my Grails databaseGrails - 从不同的数据源获取数据并将其保存在我的 Grails 数据库中
【发布时间】:2015-01-15 22:03:44
【问题描述】:

我有一个 Grails 项目,它需要从另一个项目上运行的数据库中检索数据。这个另一个项目在不同的平台(Drupal)上运行,并且具有不同的域。我只需要读取这个数据库中的一些表,并将其保存在我自己的数据源中。

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 所以您想对 Drupal 数据源进行 SQL 查询,并使用该数据来填充和保存 Grails 域类?
  • 这正是我所需要的!

标签: grails datasource


【解决方案1】:

最快的方法是使用 GORM 的support for multiple datasources,它旨在用于在两个或多个数据库之间划分域类,但您不必为第二个数据源分配任何内容。一个小的缺点是这样做会创建一个额外的事务管理器、Hibernate 会话工厂以及更多的类和 Spring bean,但是如果不使用它们,它们不会占用太多内存。为此,请在 DataSource.groovy 中添加第二个 dataSource 块,并带有唯一的后缀(除了 Spring bean 名称外,它不会影响任何内容),例如

dataSource_drupal {
   pooled = true
   driverClassName = '...'
   username = '...'
   password = '...'
   url = '...'
}

由于此数据源不会用于 GORM,因此您无需指定 dialectdbCreatejmxExport,并且您不需要第二个 hibernate 块,只需指定所需的信息创建连接池(默认会创建 10 个初始连接)。

如果您担心这种方法的额外内存(您不应该这样,它会很少),您可以做更多的工作并在grails-app/conf/spring/resources.groovy 中手动注册一个 Spring bean。如果您使用的是最新版本的 Grails,则数据源实现是 Tomcat JDBC Connection Pool,因此请使用其驱动程序类和 setter 属性名称来指定连接信息。使用任何有效的 Spring bean 名称,但我会遵循来自多个数据源支持的约定:

import org.apache.tomcat.jdbc.pool.DataSource

beans = {

   dataSource_drupal(DataSource) { bean ->
        bean.destroyMethod = 'close'

        driverClassName = '...'
        url = '...'
        username = '...'
        password = '...'

        // optional extra settings, not really needed
        // unless you expect a lot of usage
        initialSize = 42
        testOnBorrow = true
        testWhileIdle = false
        testOnReturn = false
        validationQuery = 'SELECT 1'
   }
}

因此,要使用您的第二个数据源,请将其依赖注入到您将用于执行数据迁移工作的服务中:

def dataSource_drupal

要进行 SQL 查询,最好的选择是 groovy.sql.Sql,因为它很好地隐藏了与 JDBC 代码有关的大部分仪式。添加导入

import groovy.sql.Sql

并创建一个新实例,将 DataSource bean 传递给它的构造函数,以便它可以使用它来获取连接:

Sql sql = new Sql(dataSource_drupal)
sql.eachRow('select name, bar from foo' ) { row ->
   Foo foo = new Foo(name: row.name, bar: row.bar)
   if (!foo.save()) {
       log.error "Validation error(s) for data $row: $foo.errors"
   }
}

【讨论】:

  • 非常感谢您的详细回答。如您所述,我设置了第二个数据源,但是在尝试运行“Sql sql = new Sql(dataSource_drupal)”时出现以下错误:“由于原型之间的重叠,无法解析为 [null] 调用哪个方法:[interface java.sql.Connection] [interface javax.sql.DataSource]" 你认为我缺少什么?
  • 它告诉你dataSourceDrupal 变量为null,它不知道将null 传递给哪个方法。所以你需要修复失败的依赖注入。用于依赖注入的名称必须与 DataSource.groovyresources.groovy 中的名称完全匹配,并且必须是类范围字段,而不是方法中的局部变量。
猜你喜欢
  • 2015-02-24
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2020-03-03
相关资源
最近更新 更多