Activiti数据源配置

Activiti 在启动时,会读取数据源配置,用于对数据库进行相应的操作。

Activiti 默认使用 H2 数据库,H2 是一个开源的嵌入式数据库,使用 Java 语言编写。使用H2 数据库并不需要另外安装服务器或者客户端,只需要提供一个 jar 包即可使用。在实际的企业应用中,很少会使用这种轻量级的嵌入式数据库,因此 H2 数据更适合使用于单元测试。除 H2 数据库,Activiti 还为以下的数据库提供支持:

MySQL:主流数据库之一,它是一个开源的小型关系型数据库,由它体积小、速度快,得到相当多开发者的青睐,并且最重要的是,它是免费的。

Oracle:目前世界上最流行的商业数据库,价格昂贵,但是它高效的性能、可靠的数据管理,仍令不少企业心甘情愿为其掏钱。

Postgres:PostgreSQL 是另外一款开源的数据库。

DB2:由 IBM 公司研发的一款关系型数据库,其良好的伸缩性、数据库的高效性,让它成为继 Oracle 之后,又一应用广泛的商业数据库。

MSSQL:微软研发的一款数据库产品,目前也支持在 Linux 下使用。

 

Activiti 与 Spring

Spring 是目前非常流行的一个轻量级 J2EE 框架,它提供了一套轻量级的企业应用解决方案,它包括 IoC 容器、AOP 面向切面技术以及 Web MVC 框架等。

使用 Activiti 的项目,并不意味着一定要使用 Spring,Activiti 可以在没有 Spring 的环境中使用。虽然 Activiti 并不需要使用 Spring 环境,但是 Activiti 在创建流程引擎时,使用了 Spring 的 XML 解析与依赖注入功能,ProcessEngineConfiguration 对应的配置,即为Spring 中的一个 bean。

 

JDBC配置

JDBC 连接数据库,需要使用 jdbc url、jdbc 驱动、数据库用户名和密码,以下代码为连接 MySQL 的配置:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    <!-- JDBC url -->
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
    <!-- JDBC 驱动 -->
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
    <!-- 数据库用户名 -->
    <property name="jdbcUsername" value="root" />
    <!-- 数据库密码 -->
    <property name="jdbcPassword" value="123456" />
</bean>

以上代码配置一个 bean,表示一个 ProcessEngineConfiguration,并且使用“设值注入”的方式将四个数据库属性设置到该 bean 中,换言之,该 ProcessEngineConfiguration类中,肯定有相应属性的 setter 方法。

如果不使用第三方数据源,直接使用 Activiti 提供的数据源,那么还可以指定其他一些数据库属 性 。 Activiti默认使用的 是 myBatis 的 数 据 连 接 池 , 因此ProcessEngineConfiguration 中也提供了一些 MyBatis 的配置:

jdbcMaxActiveConnections:在数据库连接池内最大的活跃连接数,默认值为 10。

jdbcMaxIdleConnections:连接池最大的空闲连接数。

jdbcMaxCheckoutTime:连接被取出使用的最长时间,超过时间会被强制回收。当连接池内的连接耗尽,外界向连接池请求连接时,创建连接的等待时间,单位为毫秒,默认值为 20000,即 20 秒。

jdbcMaxWaitTime:当整个连接池需要重新获取连接的时候,设置等待时间,单位为毫秒,默认值为 20000,即 20 秒。这是一个底层配置,让连接池可以在长时间无法获取连接时,打印条日志,并重新尝试获取一个连接。(避免因为错误配置导致沉默的操作失败)。

 

DBCP 数据源配置

DBCP 是 Apache 提供的一个数据库连接池。ProcessEngineConfiguration 中提供了一个 dataSource 属性,如果用户不希望将 JDBC 的相关连接属性交给 Activiti,可以自己创建数据库连接,然后通过这个 dataSource 属性设置到 ProcessEngineConfiguration 中。为Activiti 的 ProcessEngineConfiguration 设置 dataSource,可以采用配置或者编写代码的方
式。

<!-- 使用 DBCP 数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url" value="jdbc:mysql://localhost:3306/act" />
	<property name="username" value="root" />
	<property name="password" value="123456" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<property name="dataSource" ref="dataSource" />
</bean>

以上activiti-text.xml文件配置了一个 DBCP 的 dataSource bean,然后在processEngineConfiguration 的 bean 中注入该 dataSource。在初始化流程引擎配置时,只需根据情况调用 ProcessEngineConfiguration 的 createXXX 方法即可。

// 读取 activiti-test.xml 配置
ProcessEngineConfiguration config = ProcessEngineConfiguration
        .createProcessEngineConfigurationFromResource("activiti-test.xml");
// 能正常输出,即完成配置
DataSource ds = config.getDataSource();
// 查询数据库元信息,如果能查询则表示连接成功
ds.getConnection().getMetaData();
// 结果为 org.apache.commons.dbcp.BasicDataSource
System.out.println(ds.getClass().getName());

使用了createProcessEngineConfigurationFromResource 方法读取 Activiti 的配置文件。除使用配置外,也可以通过编码方式设置相应的 dataSource,只需要先创建一个DataSource 对象,然后设置到 ProcessEngineConfiguration 中即可。

// 创建 DBCP 数据源
BasicDataSource ds = new BasicDataSource();
// 设置 JDBC 连接的各个属性
ds.setUsername("root");
ds.setPassword("123456");
ds.setUrl("jdbc:mysql://localhost:3306/act");
ds.setDriverClassName("com.mysql.jdbc.Driver");
// 验证是否连接成功
ds.getConnection().getMetaData();
// 读取 Activiti 配置文件
ProcessEngineConfiguration config = ProcessEngineConfiguration
        .createProcessEngineConfigurationFromResource("activiti-test.xml");
// 为 ProcessEngineConfiguration 设置 dataSource 属性
config.setDataSource(ds);
System.out.println(config.getDataSource());

以上代码执行时先创建 DataSource 对象,然后为该对象设置相应的数据库连接属性,然后读取 Activiti 配置文件,得到 ProcessEngineConfiguration 对象,并将 DataSource 设置到该对象中。此时ProcessEngineConfiguration 的 bean 配置不需要设置任何属性(因为属性通过编码方式进行了设置):

<!-- 不初始化任何属性 -->
<bean id="processEngineConfiguration"     
        class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
</bean>

 

C3P0 数据源配置

与 DBCP 类似,C3P0 也是一个开源的数据库连接池,它们都被广泛的应用到开源项目以及企业用中同。与 DBCP 类似,可以在 Activiti 中使用 C3P0 数据源,配置方式大致相同。

<!-- 使用 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<property name="driverClass" value="com.mysql.jdbc.Driver" />
	<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
	<property name="user" value="root" />
	<property name="password" value="123456" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
	<property name="dataSource" ref="dataSource" />
</bean>

此处需要注意的是,DBCP 与 C3P0 的属性名称不一样,可以到两个数据源的官方文档查看更详细的配置。除了配置方式外,也可以像 DBCP 一样使用编码方式创建数据源,设置方式基本与DBCP 一致,只是创建 DataSource 实例的方式不一样而已。

// 创建 C3P0 数据源
ComboPooledDataSource ds = new ComboPooledDataSource();
// 设置 JDBC 连接的各个属性
ds.setUser("root");
ds.setPassword("123456");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/act");
ds.setDriverClass("com.mysql.jdbc.Driver");
// 验证是否连接成功
ds.getConnection().getMetaData();
// 读取 Activiti 配置文件
ProcessEngineConfiguration config = ProcessEngineConfiguration
        .createProcessEngineConfigurationFromResource("config/activiti-test.xml");
// 为 ProcessEngineConfiguration 设置 dataSource 属性
config.setDataSource(ds);
System.out.println(config.getDataSource());

 

数据库策略配置

ProcessEngineConfiguration 提供了 databaseSchemaUpdate 属性,该项可以设置流程引擎启动和关闭时数据库执行的策略。Activiti 的官方文档中,databaseSchemaUpdate有以下三个值:

false:false 为默认值,设置为该值后,Activiti 在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。

true:设置为该值后,Activiti 会对数据库中所有的表进行更新,如果表不存在,则Activiti 会自动创建。

create-drop:Activiti 启动时,会执行数据库表的创建操作,在 Activiti 关闭时,执行数据库表的删除操作。

另外,databaseSchemaUpdate还以一个非Activiti 的官方文档提供的值:

drop-create:Activiti 启动时,在将原有的数据删除

 

以下配置文件将databaseSchemaUpdate设置为false:

<!-- 将 databaseSchemaUpdate 设置为 false -->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUsername" value="root" />
    <property name="jdbcPassword" value="123456" />
    <property name="databaseSchemaUpdate" value="false"/>
</bean>

使用以下代码启动 Activiti 流程引擎:

//读取 Activiti 配置
ProcessEngineConfiguration config = ProcessEngineConfiguration
        .createProcessEngineConfigurationFromResource("activiti-test.xml");
//启动 Activiti
config.buildProcessEngine();

以上代码启动Activiti时,如果没有数据表,则会抛出异常。这里需要注意的是,如果想看到抛出异常的效果,需要将相应数据库里面的表全部删除。如果想执行数据库表结构更新,可以将该配置设置为 true,将全部数据库表删除后,再启动 Activiti,即可看到 Activiti 已经建好全部的表。

将 databaseSchemaUpdate 设置为 create-drop 后,Activiti 会先检查数据表是否存在,如果表已经存在,则抛出异常并停止创建流程引擎。以下是使用 create-drop 属性启动 Activiti的测试示例:

// 读取 Activiti 配置
ProcessEngineConfiguration config = ProcessEngineConfiguration
        .createProcessEngineConfigurationFromResource("activiti-test.xml");
// 启动 Activiti
ProcessEngine engine = config.buildProcessEngine();
// 关闭流程引擎
engine.close();

配置为 create-drop时,如果想要 Activiti 执行“drop”操作,必须要调用ProcessEngine 的 close 方法,否则将不会删除表。一般情况下,将 databaseSchemaUpdate配置为 create-drop,更适合在单元测试中使用。

除了 false 、true 和 create-drop 三个值外 , databaseSchemaUpdate 还有一个drop-create 值,跟 create-drop 类似,drop-create 会在流程引擎启动时,先将原来全部的数据表删除,再进行创建,与 create-drop 不同的是,不管是否调用 ProcessEngine 的 close方法,都会执行 create 操作。同样地,该值在单元测试中使用比较合适,在流程引擎初始化时将原有的数据删除,在实际应用中,此举会带来较大的风险,Activiti 的官方文档并没有提供该项配置。

注意:

使用各种方法读取 Activiti 配置,均不会创建数据库表,Activiti 的数据库表只会在流程引擎创建的时候,才会按照配置的策略进行创建。

 

databaseType 配置

将 databaseSchemaUpdate 设置为 create-drop 或者 drop-create时,Activiti 在启动和初始化时,会执行相应的创建表和删除表操作,Activiti 支持多种数据库,每种数据库的创建表与删除表的语法有可能不一样,因此,需要指定 databaseType 属性,来告诉 Activiti,目前使用了何种数据库(当然,如果设置 true 而数据库中没有表的话,也需要知道使用哪种数据库)。

databaseType 属性支持这些值:h2, mysql, oracle, postgres, mssql, db2,没有指定值时,databaseType 为 null。指定 databaseType 属性,目的是为了确定执行创建(或删除)表的 SQL 脚本。

我们来看一个配置:

<!-- 将 databaseType 设置为 oracle -->
<bean id="processEngineConfiguration"     class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUsername" value="root" />
    <property name="jdbcPassword" value="123456" />
    <property name="databaseSchemaUpdate" value="create-drop"/>
    <property name="databaseType" value="oracle"/>
</bean>

使用以上配置,然后启动和关闭 Activiti,会抛出 MySQL 异常,因为 Activiti 会根据该值去使用 Oracle 创建表和删除表的脚本,Oracle 的 SQL 脚本在 MySQL 上面执行,肯定会出错。

实际上,可以根本不需要指定该属性,Activiti 就可以知道使用的是哪种数据库,因为配置数据源时就提供了 JDBC 连接属性给 Activiti,根据这些属性创建 JDBC 连接,得到Connection 对象后,可以调用 getMetaData 方法获取当前数据库的元数据,完全可以判断出当前所使用的数据库。的确,Activiti 也是这样做的,但是为什么另外提供一个databaseType 属性如此多此一举呢?我们可以这样认为,Activiti 为防止适配数据库类型出现异常,就提供多一个这样的值来给使用者选择,确保能适配到准确的数据库类型。

需要注意的一点是,没有配置 databaseType 属性,Activiti 会使用 Connection 的 getMetaData 方法获取数据库元数据,但是一旦配置了 databaseType 属性,将会以该值为准。

 

相关文章

Activiti中的流程配置文件

获取Activiti流程引擎配置信息

 

 

 

 

猜你喜欢

转载自blog.csdn.net/lxxiang1/article/details/82469701