代码之家  ›  专栏  ›  技术社区  ›  Ben Williams

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

  •  20
  • Ben Williams  · 技术社区  · 16 年前

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

    6 回复  |  直到 8 年前
        1
  •  26
  •   Sushanth CS    11 年前

    在Grails2.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
  •  20
  •   Peter    12 年前

    如果使用Grails2.0或更高版本,则不需要该插件,它是本机支持的。

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

        3
  •  9
  •   Ben Williams    16 年前

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

        4
  •  2
  •   biniam    8 年前

    Grails2.0可以在不使用插件的情况下处理多个数据源:

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

    数据源.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
  •  1
  •   Paul    13 年前

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

    1. 应用程序在自己的数据库模式中管理自己的数据
    2. 通常,应用程序需要来自其他来源的数据(例如,引用数据不会被复制和粘贴)

    我通常对驻留在一个数据库实例上的所有模式都很感兴趣。因此,我的申请:

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

    使用视图的原因是,暴露数据的应用程序

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

    实际上,我并不需要使用Grails应用程序来实现这一点,但是这种方法应该是有效的。

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

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

        6
  •  -1
  •   marc_s    8 年前

    以下文章似乎是有关这一主题的最佳信息来源:

    How to get mutli-dataSource in grails

    归根结底是:

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

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

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