第8章. jBPM数据库

 

第8章. jBPM数据库

8.1. Switching the Database Backend

    切换数据库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文档.

8.1.1. 安装PostgreSQL数据库管理器

    我们可以查阅安装手册来安装PostgreSQL或其他你可能使用到的数据库,PostgreSQL在windows下的安装十分简单,安装程序会创建一个专门的windows 用户并允许它来定义数据库的管理员, 我们将使用PostgreSQL自带的叫pgAdmin III的管理工具来创建数据库,使用这个工具来创建JbpmDB数据库的截屏如下图所示:

The PostgreSQL pgAdmin III tool after creating the JbpmDB database

Figure 8.1.  创建了JbpmDB数据库后的PostgreSQL pgAdmin III工具

    安装完数据库以后,我们可以使用一个象DBVisualizer的数据库视图工具来查看数据库的内容.在你使用DBVisualizer定义一个数据库连接之前,你需要添加PostgreSQL JDBC到driver manager中,选择'Tools->Driver Manager...' 打开 driver manager管理窗口,查看下图是如何添加PostgreSQL JDBC driver的例子.

Adding the JDBC driver to the driver manager

Figure 8.2. 添加JDBC driver 到 driver manager

    现在,在DBVisualizer中定义一个数据库连接的一切已经设置到我们刚刚创建的数据库中,后边在这个文档中,我们将使用这个工具确保创建脚本和流程部署如期望一样的工作, DBVisualizer下创建一个连接的例子我们可以查看下图,正如你看到你,在当前这个数据库中不存在表,我们将在下边的章节产生它.

Create the connection to the jBPM database

Figure 8.3. 创建到jBPM数据库的链接

    另一个值得提及的就是上边的数据库URL:'jdbc:postgresql://localhost:5432/JbpmDB'.如果你创建的JbpmDB是其它名字,或者你的PostgreSQL数据库没有运行在本机,或运行在其它端口,你需要适应你的数据库URL相应的保持一致.

8.1.2.创建JBoss jBPM数据库

    正如已经提及的,你将在DB子项目中找到许多支持的数据库的数据库脚本,PostgreSQL的数据库脚本可以在 ${JBPM_SDK_HOME}/jbpm-db/build/postgresql/scripts目录找到, 创建脚本叫postgresql.create.sql,使用DBVisualizer,你可以通过切换到'SQL Commander'选项卡然后选择'File->Load...'来载入这个脚本文件, 下边的窗口是创建脚本文件的导航,这样做的结果在下边的图中显示.

Load the database creation script

Figure 8.4. 载入数据库创建脚本

DBVisualizer中要执行这个脚本,你选择 'Database->Execute',这一步以后所有的JBoss jBPM表已经创建,结果如下图所示.

Running the database creation script

Figure 8.5. 运行数据库创建脚本

    那些步骤以后,当前的表还没有任何的数据,为了让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');

8.1.3. 更新JBoss jBPM 服务器配置

    在我们真正在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是否能够工作,你不能启动其他程序,因为他们还没有配置, 要完成这个你可以查阅流程定义部署的文档.

8.2. Database upgrades

在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;

8.3. Starting hsqldb manager on JBoss

    hypersonic数据库管理器,对于jBPM并不十分关键,但是在开发的有些情况下,打开hypersonic数据库管理器来访问 JBoss hypersonic数据库将十分方便..

要启动hypersonic数据库管理器,可以打开浏览器,导航到jBPM 服务器 JMX console,要完成这些你在浏览器中使用的URL是:http://localhost:8080/jmx-console, 当然如果你的jBPM运行在其它机器或者其它端口,这会有一些不同, 一个结果页面的截屏如下图所示:

The JBoss jBPM JMX Console

Figure 8.6. The JBoss jBPM JMX Console

如果你点击JBoss入口下的'database=localDB,service=Hypersonic'链接,你就会发现 HSQLDB 数据库管理器的JMX MBean视图,将页面向下移动一点,在操作的部分,你会发现'startDatabaseManager()'操作,这些将在下面的截屏中说明.

The HSQLDB MBean

Figure 8.7. The HSQLDB MBean

点击invoke按扭将启动HSQLDB数据库管理应用程序,这是一个十分粗糙的数据库客户端工具,但是它对我们执行生成脚本的目的是好的, 你可以通过ALT-TAB来查看这个应用程序的视图因为它有可能给其它窗口覆. 下图展示了这个应用程序载入了上面的脚本并准备执行,按下'Execute SQL'按扭将会执行这个脚本并有效的更新你的数据库.

The HSQLDB Database Manager

Figure 8.8. The HSQLDB Database Manager

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值