最快的方法是使用 GORM 的support for multiple datasources,它旨在用于在两个或多个数据库之间划分域类,但您不必为第二个数据源分配任何内容。一个小的缺点是这样做会创建一个额外的事务管理器、Hibernate 会话工厂以及更多的类和 Spring bean,但是如果不使用它们,它们不会占用太多内存。为此,请在 DataSource.groovy 中添加第二个 dataSource 块,并带有唯一的后缀(除了 Spring bean 名称外,它不会影响任何内容),例如
dataSource_drupal {
pooled = true
driverClassName = '...'
username = '...'
password = '...'
url = '...'
}
由于此数据源不会用于 GORM,因此您无需指定 dialect、dbCreate 或 jmxExport,并且您不需要第二个 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"
}
}