由于Grails是基于Java技术构建的,因此配置数据源需要一些JDBC (the technology that stands for Java Database Connectivity)方面的知识。
如果你选择使用H2数据库以外的数据库,你需要先有一个JDBC驱动,例如MySQL需要Connector/J。JDBC驱动通常是以JAR包的形式存在的。此外,一个项目中会用到很多很多的JAR包,手动管理的话将十分麻烦,好在出现了Maven,它使你可以简简单单通过配置文件实现JAR包及其依赖的管理。例如你可以添加一条配置来从Maven库中获取MySQL驱动,关键代码如下:
dependencies {
runtime 'mysql:mysql-connector-java:5.1.29'
}
那么现在,驱动的问题解决了。接下来,需要了解的是,在Grails中如何对数据库进行配置。关于数据库配置文件的位置所在,共有两处可选,grails-app/conf/application.groovy或grails-app/conf/application.yml。关键配置信息及相关说明如下:
driverClassName JDBC驱动的类名,如com.mysql.jdbc.Driver
url JDBC的访问url,如jdbc:mysql://localhost:3306/my_database
username 数据库登录账号,如root
password 数据库登录密码,如12346
dbCreate 是否根据模型(domain model)自动生成数据库表,可选值有create,create-drop,update,validate。注:数据库需要自己手动去建立。
#################################
附加信息:
create 在程序启动时删除并重建表结构。
create-drop 在程序启动时构建表结构,在关闭程序时删除构建的表。从某种程度上看,与create方法效果相同,默认值。
update 更新,根据模型更新数据库,但更新的原则是保守更新,即可增但不可删,新字段是允许自动添加的,但旧的无用字段不会自动删除,因此表中的字段有新也有旧。
validate 验证,即不会改变数据库,只验证数据库与模型之间的映射是否合法,适用于部署到production环境之中。
#################################
pooled 是否使用连接池,连接池是用于管理数据库连接的缓冲池
logSql 是否将SQL日志输出到控制台
formatSql 格式化输出到控制台上的SQL
dialect 用来指代具体数据库的方言类,如org.hibernate.dialect.MySQL5InnoDBDialect
readOnly 设置数据源为只读状态,这将导致每次连接都会调用setReadOnly(true)方法
properties 数据源的额外配置。
以application.groovy为例,可以针对MySQL进行如下配置:
------------------------------------------------application.groovy
dataSource {
pooled = true
dbCreate = "update"
url = "jdbc:mysql://localhost:3306/my_database"
driverClassName = "com.mysql.jdbc.Driver"
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
username = "root"
password = "123456"
properties {
jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
}
}
-----------------------------------------------例2
dataSource {
pooled = true
dbCreate = "update"
url = "jdbc:mysql://localhost:3306/my_database"
driverClassName = "com.mysql.jdbc.Driver"
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
username = "username"
password = "password"
properties {
// Documentation for Tomcat JDBC Pool
// http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#Common_Attributes
// https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/tomcat/jdbc/pool/PoolConfiguration.html
jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
ignoreExceptionOnPreLoad = true
// http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#JDBC_interceptors
jdbcInterceptors = "ConnectionState;StatementCache(max=200)"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED // safe default
// controls for leaked connections
abandonWhenPercentageFull = 100 // settings are active only when pool is full
removeAbandonedTimeout = 120
removeAbandoned = true
// use JMX console to change this setting at runtime
logAbandoned = false // causes stacktrace recording overhead, use only for debugging
// JDBC driver properties
// Mysql as example
dbProperties {
// Mysql specific driver properties
// http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
// let Tomcat JDBC Pool handle reconnecting
autoReconnect=false
// truncation behaviour
jdbcCompliantTruncation=false
// mysql 0-date conversion
zeroDateTimeBehavior='convertToNull'
// Tomcat JDBC Pool's StatementCache is used instead, so disable mysql driver's cache
cachePrepStmts=false
cacheCallableStmts=false
// Tomcat JDBC Pool's StatementFinalizer keeps track
dontTrackOpenResources=true
// performance optimization: reduce number of SQLExceptions thrown in mysql driver code
holdResultsOpenOverStatementClose=true
// enable MySQL query cache - using server prep stmts will disable query caching
useServerPrepStmts=false
// metadata caching
cacheServerConfiguration=true
cacheResultSetMetadata=true
metadataCacheSize=100
// timeouts for TCP/IP
connectTimeout=15000
socketTimeout=120000
// timer tuning (disable)
maintainTimeStats=false
enableQueryTimeouts=false
// misc tuning
noDatetimeStringSync=true
}
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)