我试过在另一个问题中提出这个问题,但我可能会提出太多细节。
我正在使用Grails和多个数据源。 如果你想使用服务来声明数据源,那对我来说根本不起作用。
static datasource = "db1"
无论如何,这在Grails Services中对我没有用处
感谢您提供任何帮助/建议。
== 我正在编辑这个以包含我的Datasource.groovy
现在,如果我在第二个数据库的域对象上使用静态映射,这可以正常工作。但是,我希望服务决定必须写入哪个数据库,因此我希望service datasource属性在文档中起作用。
如果我声明我的域对象使用“ALL”数据源,那么服务将写入默认数据源,尽管我设置了
static datasource =“db21”
如果我声明我的域对象使用“db1”数据源,则该服务将写入db1数据源
=============== edit ==============
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "validate"
url = "jdbc:h2:devDb;MVCC=TRUE"
}
dataSource_db1 {
dbCreate = "validate"
url = "jdbc:h2:dev1Db;MVCC=TRUE"
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb;MVCC=TRUE"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
答案 0 :(得分:1)
我们在Grails应用程序中使用了多个数据源,并且已成功使用您在上面指出的方法在服务中切换数据源...
static datasource = "db1"
然而,区别在于我们在所有域对象中都定义了域对象所属的数据源。我不确定是否可以在映射中定义非默认数据源。
static mapping = { datasource 'db1' }
在某些情况下,我们将有2个不同的域类,它们具有相同的名称,但指向不同的数据源。为了保持这种清洁,我们将把2个域类放在不同的包中,并将这些域类/数据源放在同一个包中。
例如......
//Domain Classes
package com.yourcompany
class Student {
static mapping = {
//if you don't indicate the datasource it will use the default
}
}
package com.yourcompany.db1
class Student {
static mapping = {
datasource 'db1'
}
}
//Services
package com.yourcompany
class DefaultDbService {
def getStudents() {
//This will query the default datasource
Student.findAll()
}
}
package com.yourcompany.db1
class Db1Service {
static datasource = "db1"
def getStudents() {
//This will query the 'db1' datasource
Student.findAll()
}
}
您可以尝试这种方法,看看它是否能为您提供您正在寻找的结果。