默认情况下,所有域类共享单个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