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

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

请您参考如下方法:

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

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

由于此数据源不会用于 GORM,因此您无需指定 dialect , dbCreate , 或 jmxExport ,并且您不需要第二个 hibernate block ,仅创建连接池所需的信息(默认情况下它将创建 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' 
   } 
} 

因此,要使用您的第二个数据源,请将其依赖注入(inject)到您将用于执行数据迁移工作的服务中:
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" 
   } 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!