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

时间:2008-09-03 01:23:50

标签: grails

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

6 个答案:

答案 0 :(得分:26)

在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

答案 1 :(得分:20)

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

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

答案 2 :(得分:9)

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

答案 3 :(得分:2)

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"
            }
        }
    }
}

答案 4 :(得分:1)

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

  1. 应用程序在自己的数据库架构中管理自己的数据
  2. 通常,应用程序将需要来自其他来源的数据(例如,因此不会复制和粘贴参考数据)
  3. 我通常总是拥有驻留在一个数据库实例上的所有模式。因此,我的申请:

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

    使用视图的原因是使得公开数据的应用程序

    1. 明确知道它正在导出以及正在导出的内容
    2. 不公开架构的内部结构(因此,如果内部结构发生更改,只要视图正确,消费应用程序就不知道)
    3. 我实际上不必使用Grails应用程序执行此操作,但该方法应该可行。

      跨应用程序共享数据的另一种方法是创建一个Web服务来公开数据。 Grails让这很容易。

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

答案 5 :(得分:-1)

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

How to get mutli-dataSource in grails

归结为:

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

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

如果它是一个非常简单的查询,并且不介意没有ORM功能,那么可以使用Groovy SQL或Hibernate的本机SQL功能。