Grails多数据源与版本控制

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/IT_hejinrong/article/details/82627722

        默认情况下,所有域类共享单个DataSource和单个数据库,但您可以选择将域类划分为两个或多个数据源。

 

一、配置其他数据源

       默认DataSource配置grails-app/conf/application.yml看起来像这样:

 

dataSource:
    pooled: true
    jmxExport: true
    driverClassName: org.h2.Driver
    username: sa
    password:

environments:
    development:
        dataSource:
            dbCreate:
create-drop
            url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
    test:
        dataSource:
            dbCreate:
update
            url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
    production:
        dataSource:
            dbCreate:
update
            url: jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
            properties:
               jmxEnabled:
true
               initialSize: 5

这配置了一个DataSource名为Spring bean 的单个bean dataSource要配置额外的数据源,请使用自定义名称添加dataSources块(在顶层,环境块或两者中,就像标准DataSource定义一样)。例如,此配置增加了第二个DataSource,在开发环境中使用MySQL,在生产中使用Oracle:

dataSource:
    pooled: true
    jmxExport: true
    driverClassName: org.h2.Driver
    username: sa
    password:

dataSources:   #定义另一个数据源
    lookup:
        dialect: org.hibernate.dialect.MySQLInnoDBDialect
        driverClassName: com.mysql.jdbc.Driver
        username: lookup
        password: secret
        url: jdbc:mysql://localhost/lookup
        dbCreate: update

environments:
    development:
        dataSource:
            dbCreate: create-drop
            url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
    test:
        dataSource:
            dbCreate: update
            url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
    production:
        dataSource:
            dbCreate: update
            url: jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
            properties:
                jmxEnabled: true
                initialSize: 5
                ...
        dataSources:
            lookup:
                dialect: org.hibernate.dialect.Oracle10gDialect
                driverClassName: oracle.jdbc.driver.OracleDriver
                username: lookup
                password: secret
                url: jdbc:oracle:thin:@localhost:1521:lookup
                dbCreate: update

只要Hibernate支持,您就可以使用相同或不同的数据库。

如果需要lookup在Grails工件中注入数据源,可以这样做:

DataSource dataSource_lookup

注意:

  在定义多个数据源时,其中一个必须命名为“dataSource”。这是必需的,因为Grails通过确定哪个数据源名为“dataSource”来确定哪个数据源是默认值。

二、配置域类


     如果域类没有DataSource配置,则默认为标准'dataSource'。datasource在mapping块中设置属性以配置非默认值DataSource。例如,如果要使用ZipCode域来使用'lookup' DataSource,请按如下所示进行配置:

class ZipCode {

   String code

   static mapping = {
      datasource 'lookup'
   }
}
域类还可以使用两个或更多数据源。使用datasources具有名称列表的属性来配置多个名称,例如:

class ZipCode {

   String code

   static mapping = {
      datasources(['lookup', 'auditing'])
   }
}
如果域类使用默认值DataSource和一个或多个其他域类,请使用特殊名称'DEFAULT'来指示默认值DataSource:

class ZipCode {

   String code

   static mapping = {
      datasources(['lookup', 'DEFAULT'])
   }
}
如果域类使用所有已配置的数据源,请使用特殊值'ALL':

class ZipCode {

   String code

   static mapping = {
      datasource 'ALL'
   }
}

三、命名空间和GORM方法


     如果域类使用多个域名,DataSource则可以使用每个DataSource名称隐含的命名空间为特定域名进行GORM调用DataSource。例如,考虑使用两个数据源的此类:

class ZipCode {

   String code

   static mapping = {
      datasources(['lookup', 'auditing'])
   }
}
第一个DataSource指定是不使用显式命名空间时的默认值,因此在本例中我们默认为'lookup'。但您可以DataSource使用DataSource名称在“审核”上调用GORM方法,例如:

def zipCode = ZipCode.auditing.get(42)
...
zipCode.auditing.save()
如您所见,您可以DataSource在静态情况和实例情况下添加方法调用。

四、跨多个数据源的事务


        默认情况下,Grails默认情况下不会尝试处理跨多个数据源的事务。

您可以启用Grails以使用Best Effort 1PC模式来处理跨多个数据源的事务。要做到这一点,必须设定grails.transaction.chainedTransactionManagerPostProcessor.enabled设置true在application.yml:

grails:
  transaction:
    chainedTransactionManagerPostProcessor:
      enabled:
true

五、在运行时检测版本


         您可以使用Grails对GrailsApplication类的应用程序元数据支持来检测应用程序版本。例如,在控制器中有一个可以使用的隐式grailsApplication变量:

def version = grailsApplication.metadata.getApplicationVersion()
您可以检索正在运行的Grails版本:

def grailsVersion = grailsApplication.metadata.getGrailsVersion()
或者GrailsUtil班级:

import grails.util.GrailsUtil
...
def grailsVersion = GrailsUtil.grailsVersion

猜你喜欢

转载自blog.csdn.net/IT_hejinrong/article/details/82627722