如何访问 Grails 中的两个数据库

Posted

技术标签:

【中文标题】如何访问 Grails 中的两个数据库【英文标题】:How do you access two databases in Grails 【发布时间】:2010-09-07 15:33:20 【问题描述】:

Grails 使得在其 DataSources.groovy 文件中为不同环境(开发、测试、生产)配置数据源变得非常容易,但似乎无法在一个环境中配置多个数据源。如果我需要从同一个 Grails 应用程序访问多个数据库,我该怎么办?

【问题讨论】:

我知道这是一篇旧帖子,但请将接受的答案更改为@Sushanth CS,因为这是 Grails 当前的工作方式。 ***.com/a/36647714/2245264 对此有答案。 【参考方案1】:

在 Grails 2.x.x 中连接不同域类中的不同数据库非常容易。

例如

development 
    dataSource //DEFAULT data source
      .
      .
    
dataSource_admin  //Convention is dataSource_name
        url = "//db url"
        driverClassName = "oracle.jdbc.driver.OracleDriver" 
        username = "test"
        password = 'test123'
    
dataSource_users 

    

您可以通过

在您的域类中使用任何数据源
class Role
   static mapping = 
      datasource 'users'
   


 class Product
    static mapping = 
      datasource 'admin'
   
 

For more details look at this

【讨论】:

从 2.5.x 开始,这已经改变。根据手册:docs.grails.org/latest/guide/single.html#_multiple_datasources“如果应用程序中有多个DataSource,现在有一个dataSources …​ 配置块来包含它们。以前,使用了多个dataSource 声明,并带有下划线和后缀其他数据源,例如dataSource_lookup …​ @Pere 这是不正确的:docs.grails.org/2.5.6/guide/single.html#multipleDatasources - 如您所见,它仍然是下划线符号。您可能指的是 grails 3.x.x @codewandler 你是对的;我不明白我怎么会犯这样的错误,因为我什至链接到源。正确的声明应该是:“从 3.2.1 开始,这已经改变。根据手册:docs.grails.org/latest/guide/single.html#_multiple_datasourc‌​es (blah blah)” 如果域应该在两个数据库中,但根据用户,操作将在数据库 a 或数据库 b 中发生?【参考方案2】:

如果使用 Grails 2.0 或更高版本,则不需要插件,原生支持。

http://www.grails.org/doc/latest/guide/single.html#multipleDatasources

【讨论】:

【参考方案3】:

现在有 Grails 插件,可以直接使用 Grails 的 GORM 层使用多个数据源: http://burtbeckwith.com/blog/?p=70

【讨论】:

请注意,从 Grails 2.0 开始不再需要此功能(核心框架中内置了对多个数据源的支持)【参考方案4】:

Grails 2.0 无需插件即可处理多个数据源:

dev(h2 dataSource) 和 test(mysql dataSource_mysql) 环境的不同数据源示例:

DataSource.groovy:

dataSource 
    pooled = true
    driverClassName = "org.h2.Driver"
    username = "sa"
    password = ""

dataSource_mysql 
    dialect = org.hibernate.dialect.MySQLInnoDBDialect
    driverClassName = 'com.mysql.jdbc.Driver'
    username = "user"
    password = "pass"
    url = "jdbc:mysql://mysqldb.com/DBNAME"

hibernate 
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'


// environment specific settings
environments 
    development 
        dataSource 
            configClass = HibernateFilterDomainConfiguration.class
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:file:../devDb;MVCC=TRUE"
            sqlLogging = true
        
    
    test 
        dataSource_mysql 
            configClass = HibernateFilterDomainConfiguration.class
            dbCreate = "create" // one of 'create', 'create-drop', 'update', 'validate', ''
            sqlLogging = true
        
    
    production 
        dataSource 
            dbCreate = "update"
            url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
            pooled = true
            properties 
               maxActive = -1
               minEvictableIdleTimeMillis=1800000
               timeBetweenEvictionRunsMillis=1800000
               numTestsPerEvictionRun=3
               testOnBorrow=true
               testWhileIdle=true
               testOnReturn=true
               validationQuery="SELECT 1"
            
        
    

【讨论】:

【参考方案5】:

你真的想这样做吗?根据我的经验,这里通常的情况是:

    应用程序在自己的数据库架构中管理自己的数据 通常,应用程序需要来自其他来源的数据(例如,参考数据不会被复制和粘贴)

我通常总是拥有驻留在一个数据库实例上的所有模式。因此,我的申请:

只有一个数据库连接 - 连接到它拥有的架构并具有读/写访问权限 其他应用程序通过视图“导出”其数据 我的应用程序对这些视图具有读取权限,并且具有该视图的同义词,使其显示为本地

使用视图背后的原因是为了让暴露数据的应用程序

    明确知道它正在被导出以及正在导出的内容 不暴露架构的内部结构(因此如果内部结构发生变化,只要视图正确,消费应用程序就不会知道)

我实际上不必对 Grails 应用程序执行此操作,但该方法应该可行。

另一种跨应用程序共享数据的方法是创建一个 Web 服务来公开数据。 Grails 让这一切变得简单。

希望有所帮助,但这种方法可能不适用于所有情况。

【讨论】:

如果您还在研究这个问题:在 Grails 项目中使用多个数据源 - crjug.org/?q=node/103 -1 表示没有回答原始问题,有多种工程和商业场景需要这样做。 +1 提出了一个很好的观点 - 管理多个数据源非常烦人,特别是如果您已经编写了假设您有兴趣访问的域类的应用程序代码是本地数据库。这可以让您省去返回代码、删除域关系以及手动设置关联类以映射多对多关联的麻烦。 Paul 建议的一个对我们行之有效的策略:维护一个本地“同义词”,然后检查它可能与远程数据库不同步的不同方式。 我们中的许多人都没有让我们的应用程序只使用一个数据源的奢侈,因为我们甚至没有与单一数据库供应商合作。经过 20 年或 30 年构建的应用程序通常使用当时流行的任何数据库供应商,因此您最终会为几乎任何复杂程度的应用程序提供数十种不同的数据源。【参考方案6】:

以下帖子似乎是有关该主题的最佳信息来源:

How to get mutli-dataSource in grails

归结为:

在 DevelopmentDataSource 中定义 datasource1 在resources.xml中定义datasource2 使用 datasource2 为域对象的 CRUD 编写 DAO 在 hibernate.cfg.xml 中,列出所有域对象。

只有第一个数据源会有动态查找器方法。

如果您想要的是一个非常简单的查询,并且不介意没有 ORM 功能,您可以使用 Groovy SQL 或 Hibernate 的原生 SQL 功能。

【讨论】:

这就是为什么链接到答案是一个坏主意。

以上是关于如何访问 Grails 中的两个数据库的主要内容,如果未能解决你的问题,请参考以下文章

动态连接到 grails 中的数据库

使用 Grails 在服务器端获取 JSON 数据

如何从 Grails 中的控制器访问域属性?

在哪里放置,以及如何访问 Grails 应用程序中的 jQuery 插件?

如何限制grails shiro security中的操作

grails Grails 单元测试中的应用程序访问