2

我曾尝试在另一个问题中提出这个问题,但我可能已经提供了太多细节。

我正在使用 Grails 和多个数据源。如果您想使用服务来声明数据源,那对我来说根本不起作用。

static datasource = "db1"

无论如何,这在 Grails 服务中对我不起作用

感谢您的任何帮助/建议。

== 我正在编辑它以包含我的 Datasource.groovy

现在,如果我为我的第二个数据库使用域对象上的静态映射,这很好。但是,我希望服务决定必须写入哪个数据库,因此我希望服务数据源属性与文档中的一样。

  1. 如果我声明我的域对象使用“所有”数据源,则服务将写入默认数据源,尽管我设置了

    静态数据源 = "db21"

  2. 如果我声明我的域对象使用“db1”数据源,服务将写入 db1 数据源

    1. 如果我声明 2,3...N 个数据源,看起来服务只会写入默认数据源或我在域 groovy 文件中声明的数据源。文档说我应该能够使用服务来选择数据源。

===============编辑==============

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

    }
}
4

1 回答 1

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()
   }
}

您可以尝试这种方法,看看它是否能得到您正在寻找的结果。

于 2013-09-06T22:53:36.313 回答