Grails多个DB - 使用服务来选择数据源不起作用

时间:2012-06-05 20:19:25

标签: grails service datasource

我试过在另一个问题中提出这个问题,但我可能会提出太多细节。

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

static datasource = "db1"

无论如何,这在Grails Services中对我没有用处

感谢您提供任何帮助/建议。

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

现在,如果我在第二个数据库的域对象上使用静态映射,这可以正常工作。但是,我希望服务决定必须写入哪个数据库,因此我希望service datasource属性在文档中起作用。

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

    static datasource =“db21”

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

    1. 如果我声明了2,3 ... N个数据源,看起来该服务只会写入默认数据源或我在域groovy文件中声明的数据源。文档说我应该能够使用服务来选择数据源。
  3. =============== 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"
                }
            }
    
        }
    }
    

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

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