【发布时间】:2010-09-07 15:33:20
【问题描述】:
Grails 使得在其 DataSources.groovy 文件中为不同环境(开发、测试、生产)配置数据源变得非常容易,但似乎无法在一个环境中配置多个数据源。如果我需要从同一个 Grails 应用程序访问多个数据库,我该怎么办?
【问题讨论】:
-
我知道这是一篇旧帖子,但请将接受的答案更改为@Sushanth CS,因为这是 Grails 当前的工作方式。
标签: grails
Grails 使得在其 DataSources.groovy 文件中为不同环境(开发、测试、生产)配置数据源变得非常容易,但似乎无法在一个环境中配置多个数据源。如果我需要从同一个 Grails 应用程序访问多个数据库,我该怎么办?
【问题讨论】:
标签: grails
在 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'
}
}
【讨论】:
DataSource,现在有一个dataSources { … } 配置块来包含它们。以前,使用了多个dataSource 声明,并带有下划线和后缀其他数据源,例如dataSource_lookup { … }。
如果使用 Grails 2.0 或更高版本,则不需要插件,原生支持。
http://www.grails.org/doc/latest/guide/single.html#multipleDatasources
【讨论】:
现在有 Grails 插件,可以直接使用 Grails 的 GORM 层使用多个数据源: http://burtbeckwith.com/blog/?p=70
【讨论】:
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"
}
}
}
}
【讨论】:
你真的想这样做吗?根据我的经验,这里通常的情况是:
我通常总是拥有驻留在一个数据库实例上的所有模式。因此,我的申请:
使用视图背后的原因是为了让暴露数据的应用程序
我实际上不必对 Grails 应用程序执行此操作,但该方法应该可行。
另一种跨应用程序共享数据的方法是创建一个 Web 服务来公开数据。 Grails 让这一切变得简单。
希望有所帮助,但这种方法可能不适用于所有情况。
【讨论】:
以下帖子似乎是有关该主题的最佳信息来源:
How to get mutli-dataSource in grails
归结为:
只有第一个数据源会有动态查找器方法。
如果您想要的是一个非常简单的查询,并且不介意没有 ORM 功能,您可以使用 Groovy SQL 或 Hibernate 的原生 SQL 功能。
【讨论】: