理解 DataSource.groovy
目前所做的工作都集中在单个类的调整上。下面我们要回过头来做一些全局性的修改。所有域类共享的特定于数据库的配置保存在一个公共文件内:grails-app/conf/DataSource.groovy,如清单 10 所示。请将这个文件放在一个文本编辑器内仔细查看:
清单 10. DataSource.groovy
pooled = false
driverClassName = "org.hsqldb.jdbcDriver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache=true
cache.use_query_cache=true
cache.provider_class='org.hibernate.cache.EhCacheProvider'
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop','update'
url = "jdbc:hsqldb:mem:devDB"
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:hsqldb:mem:testDb"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:hsqldb:file:prodDb;shutdown=true"
}
}
}
在 dataSource 块内能够修改用来连接数据库的 driverClassName、username 和 password。hibernate 块用来调整缓存设置(除非是 Hibernate 专家,否则不要在这里进行任何调整)。真正有意思的是 environments 块。
还记得在上一期的文章中介绍过 Grails 能够在三种模式下运行:开发模式、测试模式和生产模式。在输入 grails prod run-app 时,就是告诉 Grails 使用 production 块中的数据库设置。如果希望根据环境调整 username 和 password 的设置,只要将这些设置从 dataSource 块复制到每个 environment 块,并修改设置的值即可。 environment 块中的设置覆盖 dataSource 块中的设置。
url 设置是 JDBC 的连接字符串。请注意在 production 模式下,HSQLDB 使用基于文件的数据存储。在 development 和 test 模式下,HSQLDB 使用内存中的数据存储。上个月我介绍过如果想让 Trip 的记录在服务器重新启动之后保留,应该在 production 模式下运行。现在您应该知道如何在 development 和 test 模式下进行设置以实现这一功能 — 只要将 url 设置从 production 复制过来即可。当然,将 Grails 指向 DB2、MySQL 或者其他传统的基于文件的数据库也可以解决记录消失的问题(立刻就会介绍 DB2 和 MySQL 的设置)。
dbCreate 的值在不同的环境下会产生不同的行为。它是底层的 hibernate.hbm2ddl.auto 设置的别名,负责指定 Hibernate 在幕后如何管理表。将 dbCreate 设为 create-drop,就是告诉在启动的时候创建 表,在关闭的时候删除 表。如果将值改为 create,那么 Hibernate 会在需要的时候创建新表和修改现有表,但是重新启动之间的所有记录都会被删除。production 模式的默认值 — update — 会在重新启动之间保持所有数据,也会在需要的时候创建或修改表。
如果对传统的数据库使用 Grails,那么我强烈推荐注释掉 dbCreate 的值。这样就告诉 Hibernate 不要触及数据库的模式。虽然这意味着必须自行保持数据模型与底层数据库同步,但这可以大大减少愤怒的 DBA 为了弄清楚谁在未经允许的情况下不断修改数据库表而发来的质问邮件。
添加自定义环境也很容易。例如,公司中可能有一个 beta 程序。只要在 DataSource.groovy 中其他块之后创建一个 beta 块即可(也可以针对与数据库无关的设置在 grails-app/conf/Config.groovy 中添加一个 environments 块)。要在 beta 模式下启动 Grails,请输入 grails -Dgrails.env=beta run-app。