Grails 如何与 Firebird 集成

尘封飞扬 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

相关推荐