切换数据库Backend是十分简单的(reasonably straightforward).我们将使用PostgreSQL作为例子来开始这个过程,这个过程对于其它支持的数据库也是一样的 ,对于很多支持的数据库和驱动程序,在DB子项目中的JPBM扩展中列出了很多用来产生数据库创建脚本的Hibernate配置文件和Ant构建文件,如果你找不到你想使用的数据库的那些文件,你应该首先确保hibernate是否支持你的数据库,如果是这种情况,你可以查看DB项目中其中一个数据库的文件,然后模仿这个到你自己的数据库中.
在这个文档中,我们将使用jBPM Starter扩展工具包,我们假设这个工具包已经解压在你机器的${JBPM_SDK_HOME}路径下,你将在${JBPM_SDK_HOME}/jbpm-db路径下找到 DB子项目.
安装完数据库以后,你必须运行数据库创建脚本.那样将在数据库中产生jBPM表,为了确保缺省的webapp运行在新数据库中,我们必须修改Starter工具箱中的服务器的一些配置文件,我们没有必要深入那些配置变化的过多的细节,如果你想了解服务器中更多不同设置,我们建议你查看JBoss文档.
我们可以查阅安装手册来安装PostgreSQL或其他你可能使用到的数据库,PostgreSQL在windows下的安装十分简单,安装程序会创建一个专门的windows 用户并允许它来定义数据库的管理员, 我们将使用PostgreSQL自带的叫pgAdmin III的管理工具来创建数据库,使用这个工具来创建JbpmDB数据库的截屏如下图所示:
安装完数据库以后,我们可以使用一个象DBVisualizer的数据库视图工具来查看数据库的内容.在你使用DBVisualizer定义一个数据库连接之前,你需要添加PostgreSQL JDBC到driver manager中,选择'Tools->Driver Manager...' 打开 driver manager管理窗口,查看下图是如何添加PostgreSQL JDBC driver的例子.
现在,在DBVisualizer中定义一个数据库连接的一切已经设置到我们刚刚创建的数据库中,后边在这个文档中,我们将使用这个工具确保创建脚本和流程部署如期望一样的工作, DBVisualizer下创建一个连接的例子我们可以查看下图,正如你看到你,在当前这个数据库中不存在表,我们将在下边的章节产生它.
另一个值得提及的就是上边的数据库URL:'jdbc:postgresql://localhost:5432/JbpmDB'.如果你创建的JbpmDB是其它名字,或者你的PostgreSQL数据库没有运行在本机,或运行在其它端口,你需要适应你的数据库URL相应的保持一致.
正如已经提及的,你将在DB子项目中找到许多支持的数据库的数据库脚本,PostgreSQL的数据库脚本可以在 ${JBPM_SDK_HOME}/jbpm-db/build/postgresql/scripts目录找到, 创建脚本叫postgresql.create.sql,使用DBVisualizer,你可以通过切换到'SQL Commander'选项卡然后选择'File->Load...'来载入这个脚本文件, 下边的窗口是创建脚本文件的导航,这样做的结果在下边的图中显示.
DBVisualizer中要执行这个脚本,你选择 'Database->Execute',这一步以后所有的JBoss jBPM表已经创建,结果如下图所示.
那些步骤以后,当前的表还没有任何的数据,为了让jBPM webapp运行,你必须至少在jbpm_id_user表中创建一些记录,为了和运行在HSQLDB上的默认的starter工具箱扩展在这个表有相同的入口,我们建议你运行下列这个脚本:
insert into JBPM_ID_USER (ID_, CLASS_, NAME_, EMAIL_, PASSWORD_) values ('1', 'U', 'cookie monster', 'cookie.monster@sesamestreet.tv', 'crunchcrunch'); insert into JBPM_ID_USER (ID_,CLASS_, NAME_, EMAIL_, PASSWORD_) values ('2', 'U', 'ernie', 'ernie@sesamestreet.tv', 'canthereyoubert,theresabananainmyear'); insert into JBPM_ID_USER (ID_,CLASS_, NAME_, EMAIL_, PASSWORD_) values ('3', 'U', 'bert', 'bert@sesamestreet.tv', 'ernie,theresabananainyourear'); insert into JBPM_ID_USER (ID_,CLASS_, NAME_, EMAIL_, PASSWORD_) values ('4', 'U', 'grover', 'grover@sesamestreet.tv', 'mayday mayday');
在我们真正在JBoss jBPM确省的webapp项目中使用我们刚创建的数据库之前,我们必须对JBoss jBPM的配置做一些修改, 服务器的位置在'${JBPM_SDK_HOME}/jbpm-server',首先我们要修改的配置是创建一个新的数据源指定到我们的JbpmDB数据库,第二步,我们要确保缺省的 webapp项目和这个数据库连通,而不再和HSQLDB数据源连通.
<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>JbpmDS</jndi-name> <connection-url>jdbc:postgresql://localhost:5432/JbpmDB</connection-url> <driver-class>org.postgresql.Driver</driver-class> <user-name>user</user-name> <password>password</password> <metadata> <type-mapping>PostgreSQL 8.1</type-mapping> </metadata> </local-tx-datasource> </datasources>
为了创建一个新的数据源,你需要创建一个名为jbpm-ds.xml的文件,内容如上边列出的程序列表所示,当然你必须改变这个文件中的一些数值来适应你自己的实际情况,然后你将这个文件保存在${JBPM_SDK_HOME}/jbpm-server/server/jbpm/deploy目录下,恭喜你,你已经为你的 JBoss jBPM服务器创建了一个新的数据源,好,为了让一切工作起来,你还必须拷贝正确的JDBC驱动程序到${JBPM_SDK_HOME}/jbpm-server/server/jbpm/lib 目录下,在我们在DBVisualizer中安装这个驱动程序来浏览我们新创建的数据库的时候,我们已经使用到了它,这个文件的名字叫'postgresql-8.1-*.jdbc3.jar' 你可以在你PostgreSQL安装目录的jdbc子目录中找到.
如果你没有使用PostgreSQL,你就需要知道完成这个步骤需要查找哪些参数,JBoss应用服务器支持很多的数据库, 你可以下载一个JBoss distribution 并查看'docs/examples/jca'目录.
让缺省的webapp和正确的数据源连通并不非常困难,第一步要做的就是将'jboss-service.xml'放在'${JBPM_SDK_HOME}/jbpm-server/server/jbpm/deploy/jbpm.sar/META-INF' 目录下,改变这个文件的内容如下边列表所示,一个专心的读者就会留意到唯一的不同就是用'JbpmDS'替换'DefaultDS'.
<?xml version="1.0" encoding="UTF-8"?> <server> <mbean code="org.jbpm.db.jmx.JbpmService" name="jboss.jbpm:name=DefaultJbpm,service=JbpmService" description="Default jBPM Service"> <attribute name="JndiName">java:/jbpm/jbpmConfinguration</attribute> <depends>jboss.jca:service=DataSourceBinding,name=JbpmDS</depends> </mbean> </server>
要让一切运行起来,我们最后要走的事情就是对位于'${JBPM_SDK_HOME}/jbpm-server/server/jbpm/deploy/jbpm.sar'目录下的 'jbpm.sar.cfg.jar'文件的处理,你必须把它解压到一个地方,然后打开名为'hibernate.cfg.xml'的文件,然后替换掉包含jdbc连接属性的部分,这个部分如下面的列表所示,在这个文件中需要修改2个部分,hibernate.connection.datasource属性应该指向到我们第一步创建的数据源, hibernate.dialect property属性应当匹配PostgreSQL方言.
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate 配置 DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- jdbc connection properties --> <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> <property name="hibernate.connection.datasource">java:/JbpmDS</property> <!-- other hibernate properties <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> --> <!-- ############################################ --> <!-- # mapping files with external dependencies # --> <!-- ############################################ --> ... </session-factory> </hibernate-configuration>
现在,我们准备启动服务器来查看webapp是否能够工作,你不能启动其他程序,因为他们还没有配置, 要完成这个你可以查阅流程定义部署的文档.
在jbpm.db子项目中,你能发现:
- 一个创建jBPM 3.0.2 schema的SQL脚本 (for Hypersonic)
- 一个创建jBPM 3.1 schema的SQL脚本 (for Hypersonic)
- 一个升级jBPM 3.0.2 schema到 jBPM 3.1 schema 的SQL脚本 (for Hypersonic)
- 创建schema更新的ant脚本
schema的SQL脚本位于 hsqldb/upgrade.scripts目录.
要对你的数据库运行 schema更新工具,按照下边的指导步骤:
- 前提:确保你除jbpm项目外已经安装jbpm.db项目,在starters-kit里自动是这样的情况,如果jbpm被安装在其他的目录,相应更新 build.properties下的jbpm.3.location目录.
- 前提: 你需要你的数据库的合适的JDBC驱动程序.
- 更新jbpm.db项目根路径下的build.properties文件里的属性:
- upgrade.hibernate.properties: 一个包含你的数据库在hibernate下的连接属性的properties文件.
- upgrade.libdir: 包含你的数据库的JDBC驱动程序的目录.
- upgrade.old.schema.script: 来创建老的数据库schema的脚本(如果它仍然存在,你可以不需要这个属性).
- 通过运行'ant upgrade.db.script'脚本来创建老的schema,然后计算出它们的不同.
- 通过运行'ant upgrade.hibernate.schema.update'来仅仅计算更新的脚本,而不需要首先载入 'ant upgrade.hibernate.schema.update'文件.
- 成功完成以后,你将发现更新脚本位于build/database.upgrade.sql
对于从jBPM 3.0.2升级到jBPM 3.1,生成的更新SQL脚本(for HSQLDB)如下表所示:
# New JBPM_MESSAGE table create table JBPM_MESSAGE ( ID_ bigint generated by default as identity (start with 1), CLASS_ char(1) not null, DESTINATION_ varchar(255), EXCEPTION_ varchar(255), ISSUSPENDED_ bit, TOKEN_ bigint, TEXT_ varchar(255), ACTION_ bigint, NODE_ bigint, TRANSITIONNAME_ varchar(255), TASKINSTANCE_ bigint, primary key (ID_) ); # Added columns alter table JBPM_ACTION add column ACTIONEXPRESSION_ varchar(255); alter table JBPM_ACTION add column ISASYNC_ bit; alter table JBPM_COMMENT add column VERSION_ integer; alter table JBPM_ID_GROUP add column PARENT_ bigint; alter table JBPM_NODE add column ISASYNC_ bit; alter table JBPM_NODE add column DECISIONEXPRESSION_ varchar(255); alter table JBPM_NODE add column ENDTASKS_ bit; alter table JBPM_PROCESSINSTANCE add column VERSION_ integer; alter table JBPM_PROCESSINSTANCE add column ISSUSPENDED_ bit; alter table JBPM_RUNTIMEACTION add column VERSION_ integer; alter table JBPM_SWIMLANE add column ACTORIDEXPRESSION_ varchar(255); alter table JBPM_SWIMLANE add column POOLEDACTORSEXPRESSION_ varchar(255); alter table JBPM_TASK add column ISSIGNALLING_ bit; alter table JBPM_TASK add column ACTORIDEXPRESSION_ varchar(255); alter table JBPM_TASK add column POOLEDACTORSEXPRESSION_ varchar(255); alter table JBPM_TASKINSTANCE add column CLASS_ char(1); alter table JBPM_TASKINSTANCE add column ISSUSPENDED_ bit; alter table JBPM_TASKINSTANCE add column ISOPEN_ bit; alter table JBPM_TIMER add column ISSUSPENDED_ bit; alter table JBPM_TOKEN add column VERSION_ integer; alter table JBPM_TOKEN add column ISSUSPENDED_ bit; alter table JBPM_TOKEN add column SUBPROCESSINSTANCE_ bigint; alter table JBPM_VARIABLEINSTANCE add column TASKINSTANCE_ bigint; # Added constraints alter table JBPM_ID_GROUP add constraint FK_ID_GRP_PARENT foreign key (PARENT_) references JBPM_ID_GROUP; alter table JBPM_MESSAGE add constraint FK_MSG_TOKEN foreign key (TOKEN_) references JBPM_TOKEN; alter table JBPM_MESSAGE add constraint FK_CMD_NODE foreign key (NODE_) references JBPM_NODE; alter table JBPM_MESSAGE add constraint FK_CMD_ACTION foreign key (ACTION_) references JBPM_ACTION; alter table JBPM_MESSAGE add constraint FK_CMD_TASKINST foreign key (TASKINSTANCE_) references JBPM_TASKINSTANCE; alter table JBPM_TOKEN add constraint FK_TOKEN_SUBPI foreign key (SUBPROCESSINSTANCE_) references JBPM_PROCESSINSTANCE; alter table JBPM_VARIABLEINSTANCE add constraint FK_VAR_TSKINST foreign key (TASKINSTANCE_) references JBPM_TASKINSTANCE;
hypersonic数据库管理器,对于jBPM并不十分关键,但是在开发的有些情况下,打开hypersonic数据库管理器来访问 JBoss hypersonic数据库将十分方便..
要启动hypersonic数据库管理器,可以打开浏览器,导航到jBPM 服务器 JMX console,要完成这些你在浏览器中使用的URL是:http://localhost:8080/jmx-console, 当然如果你的jBPM运行在其它机器或者其它端口,这会有一些不同, 一个结果页面的截屏如下图所示:
如果你点击JBoss入口下的'database=localDB,service=Hypersonic'链接,你就会发现 HSQLDB 数据库管理器的JMX MBean视图,将页面向下移动一点,在操作的部分,你会发现'startDatabaseManager()'操作,这些将在下面的截屏中说明.
点击invoke按扭将启动HSQLDB数据库管理应用程序,这是一个十分粗糙的数据库客户端工具,但是它对我们执行生成脚本的目的是好的, 你可以通过ALT-TAB来查看这个应用程序的视图因为它有可能给其它窗口覆. 下图展示了这个应用程序载入了上面的脚本并准备执行,按下'Execute SQL'按扭将会执行这个脚本并有效的更新你的数据库.