我有一个Grails项目,该项目需要从在其他项目上运行的数据库中检索数据。该另一个项目在不同的平台(Drupal)上运行,并且具有不同的域。我只需要读取该数据库中的某些表,并将其保存在我自己的数据源中即可。
做到这一点的最佳方法是什么?
最快的方法是使用GORM对多个数据源的支持,该支持旨在将您的域类在两个或多个数据库之间进行分区,但是您不必为第二个数据源分配任何内容。这样做的一个小缺点是将创建一个额外的事务管理器,一个Hibernate会话工厂,以及更多的类和Spring Bean,但是如果不使用它们,它们将不会占用太多内存。为此,在第二个dataSource
块中添加一个DataSource.groovy
唯一的后缀(除了Spring bean名称,它不影响其他任何东西),例如
dataSource_drupal {
pooled = true
driverClassName = '...'
username = '...'
password = '...'
url = '...'
}
由于此数据源不会用于GORM,因此您无需指定dialect
,dbCreate
或jmxExport
,也不需要第二个hibernate
块,因此仅需要创建连接池所需的信息(默认情况下,它将创建10个初始连接)。
如果您担心这种方法的额外内存(不应该这样,那将是最小的),则可以做更多的工作,并在中手动注册一个Spring bean grails-app/conf/spring/resources.groovy
。如果使用的是Grails的最新版本,则数据源实现是Tomcat JDBC连接池,因此请使用其驱动程序类和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"
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句