尘封飞扬 2008-01-31
最近2年涌现出许多的Web快速开发框架,Grails便是一个基于Java,媲美Rails的Web快速开发框架。《使用Grails快速开发Web应用程序》教程中介绍了Grails与MySQL集成的例子,非常简单。最近下载了Firebird,希望将其与Grails集成。Grails通过Hibernate实现ORM,理论上应该没问题,然而在实际部署中缺遇到了一些问题。
首先安装Firebird和Jaybird。下载并运行Firebird-2.0.3.12981-1-Win32,将firebrid作为一个Service运行。将SYSDBA的口令更新为password:
gsec -user sysdba -pass masterkey -mo sysdba -pw password
然后为GrailsContact项目创建三个Database文件:
dev.fdb----作为Grails开发库,文件路径为e:\db\Container\dev.fdb
test.fdb----作为Grails测试库,文件路径为e:\db\Container\test.fdb
prod.fdb----作为Grails产品库,文件路径为e:\db\Container\prod.fdb
在Dos窗口中进入Firebird的iSQL命令模式,创建dev数据库的命令如下:
CREATE DATABASE 'e:\db\Contact\dev.fdb' page_size 8192 user 'sysdba' password 'password';
注意在执行上述命令前,需要在e:\db目录下创建Contact目录。
下载Jaybird2.1.2,解压缩到e:\db目录。
依据教程中的步骤创建GrailsContact项目。缺省时,使用HSQLDB作为持久服务层,如果替换为Firebird,根据教程说明,需要编辑DataSource.groovy。Firebird与MySQL等DBMS不同,它的JDBC连接URL有两种方式,例如访问dev数据库,URL字符串应为:
jdbc:firebirdsql:localhost/3050:e:\db\Contact\dev.fdb
或者为:jdbc:firebirdsql://localhost:3050/e:\db\Contact\dev.fdb
但是Grails只能识别第2种URL模式,并且数据库名字不能包含盘符、目录分割符等。经过对Firebird的研究,发现解决的方法是使用Firebird数据库别名,即为以上三个数据库在aliases.conf中设置别名:
dev = e:\db\Contact\dev.fdb test = e:\db\Contact\test.fdb prod = e:\db\Contact\prod.fdb
这样,访问dev数据库的JDBCURL可以满足Grails的要求了:
jdbc:firebirdsql://localhost:3050/dev
重新编辑Database.groovy,修改访问Firebird的DataSource的设置,文件内容如下:
dataSource { pooled = false driverClassName = "org.firebirdsql.jdbc.FBDriver" username = "sysdba" password = "password" dialect = org.hibernate.dialect.FirebirdDialect } 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 = "update" // one of 'create', 'create-drop','update' url = "jdbc:firebirdsql://localhost:3050/dev" } } test { dataSource { dbCreate = "update" url = "jdbc:firebirdsql://localhost:3050/test" } } production { dataSource { dbCreate = "update" url = "jdbc:firebirdsql://localhost:3050/prod" } } }
注意,与MySQL不同,必须在添加针对Firebird的HibernateDialect声明:
dialect=org.hibernate.dialect.FirebirdDialect
最后,需要把Firebird的JDBC驱动包(jaybird-2.1.2.jar)拷贝到Contact的lib目录下,执行grails run-app从Web浏览器中访问http://localhost:8080/Contact,可以正常地访问Firebird了。
我的测试环境为:WindowsXP/SP2+JDK1.5+Grails1.0RC4。