数据库配置
有两种方法可以配置Camunda引擎使用的数据库。第一个方法是定义数据库的JDBC属性:
jdbcUrl
: 数据库的JDBC URL。jdbcDriver
: 用于特定数据库的驱动程序实现。jdbcUsername
: 连接到数据库的用户名。jdbcPassword
: 连接到数据库的密码。
注意,引擎内部使用Apache MyBatis进行持久化。
基于提供的JDBC属性构建的数据源将具有默认的MyBatis连接池设置。以下属性可以选择性地设置,以调整该连接池(取自MyBatis文档)。
jdbcMaxActiveConnections
: 连接池在任何时间最多可以包含的活动连接数。缺省值是10。jdbcMaxIdleConnections
: 连接池在任何时间最多可以包含的空闲连接数。jdbcMaxCheckoutTime
: 连接被取出使用的最长时间,超过时间会被强制回收。默认值是20000(20秒)。jdbcMaxWaitTime
: 这是一个底层配置,让连接池可以在长时间无法获得连接时,打印一条日志,并重新尝试获取一个连接。Default是20000(20秒)。jdbcStatementTimeout
: JDBC驱动程序将等待从数据库的响应的时间内的时间量。默认值为null,这意味着没有超时。
Jdbc 批处理
另一个配置– jdbcBatchProcessing
–设置向数据库发送SQL语句时是否必须使用批处理模式。当关闭时,语句会被一个一个地执行。
可用值: true
(默认), false
.
批处理模式在流程引擎中的已知问题有:
- 批处理模式对早于12版本的Oracle不起作用。
- 当在MariaDB和DB2上使用批处理时,
jdbcStatementTimeout
配置会被忽略。
示例数据库配置
<property name="jdbcUrl" value="jdbc:h2:mem:camunda;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
或者, 也可以使用 javax.sql.DataSource
(示例,来自Apache Commons的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/camunda?sendFractionalSeconds=false" />
<property name="username" value="camunda" />
<property name="password" value="camunda" />
<property name="defaultAutoCommit" value="false" />
</bean>
<bean id="processEngineConfiguration" class="org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
...
请注意,Camunda并没有自带允许定义这种数据源的库。所以你必须确保这些库(例如来自DBCP)在你的classpath上。
无论你是使用JDBC还是数据源方法,都可以设置以下属性:
databaseType
: 通常没有必要指定这个属性,因为它可以从url中自动分析出来的。只有在自动分析失败的情况下才应该指定。可能的值有{h2, mysql, oracle, postgres, mssql, db2, mariadb}。这个设置将决定哪些创建/删除脚本和查询将被使用。参见 “支持的数据库” 一节,以了解支持哪些类型的数据库。databaseSchemaUpdate
: 允许设置策略来处理流程引擎启动和关闭时的数据库模式。
支持的数据库
有关支持数据库的信息,请参阅支持的环境
以下是一些示例JDBC URL:
- H2:
jdbc:h2:tcp://localhost/camunda
- MySQL:
jdbc:mysql://localhost:3306/camunda?autoReconnect=true&sendFractionalSeconds=false
- Oracle:
jdbc:oracle:thin:@localhost:1521:xe
- PostgreSQL:
jdbc:postgresql://localhost:5432/camunda
- DB2:
jdbc:db2://localhost:50000/camunda
- MSSQL:
jdbc:sqlserver://localhost:1433/camunda
- MariaDB:
jdbc:mariadb://localhost:3306/camunda
其他数据库架构配置
Business Key
自从 Camunda Platform 7.0.0-alpha9 发布后,在运行时和历史表以及数据库模式创建和删除脚本中,业务键的唯一约束被删除。 如果你依赖该约束,你可以手动将以下sql语句应用到你的数据库中。
DB2
Runtime:
alter table ACT_RU_EXECUTION add UNI_BUSINESS_KEY varchar (255) not null generated always as (case when "BUSINESS_KEY_" is null then "ID_" else "BUSINESS_KEY_" end);
alter table ACT_RU_EXECUTION add UNI_PROC_DEF_ID varchar (64) not null generated always as (case when "PROC_DEF_ID_" is null then "ID_" else "PROC_DEF_ID_" end);
create unique index ACT_UNIQ_RU_BUS_KEY on ACT_RU_EXECUTION(UNI_PROC_DEF_ID, UNI_BUSINESS_KEY);
History:
alter table ACT_HI_PROCINST add UNI_BUSINESS_KEY varchar (255) not null generated always as (case when "BUSINESS_KEY_" is null then "ID_" else "BUSINESS_KEY_" end);
alter table ACT_HI_PROCINST add UNI_PROC_DEF_ID varchar (64) not null generated always as (case when "PROC_DEF_ID_" is null then "ID_" else "PROC_DEF_ID_" end);
create unique index ACT_UNIQ_HI_BUS_KEY on ACT_HI_PROCINST(UNI_PROC_DEF_ID, UNI_BUSINESS_KEY);
H2
Runtime:
alter table ACT_RU_EXECUTION add constraint ACT_UNIQ_RU_BUS_KEY unique(PROC_DEF_ID_, BUSINESS_KEY_);
History:
alter table ACT_HI_PROCINST add constraint ACT_UNIQ_HI_BUS_KEY unique(PROC_DEF_ID_, BUSINESS_KEY_);
MSSQL
Runtime:
create unique index ACT_UNIQ_RU_BUS_KEY on ACT_RU_EXECUTION (PROC_DEF_ID_, BUSINESS_KEY_) where BUSINESS_KEY_ is not null;
History:
create unique index ACT_UNIQ_HI_BUS_KEY on ACT_HI_PROCINST (PROC_DEF_ID_, BUSINESS_KEY_) where BUSINESS_KEY_ is not null;
MySQL
Runtime:
alter table ACT_RU_EXECUTION add constraint ACT_UNIQ_RU_BUS_KEY UNIQUE (PROC_DEF_ID_, BUSINESS_KEY_);
History:
alter table ACT_HI_PROCINST add constraint ACT_UNIQ_HI_BUS_KEY UNIQUE (PROC_DEF_ID_, BUSINESS_KEY_);
Oracle
Runtime:
create unique index ACT_UNIQ_RU_BUS_KEY on ACT_RU_EXECUTION
(case when BUSINESS_KEY_ is null then null else PROC_DEF_ID_ end,
case when BUSINESS_KEY_ is null then null else BUSINESS_KEY_ end);
History:
create unique index ACT_UNIQ_HI_BUS_KEY on ACT_HI_PROCINST
(case when BUSINESS_KEY_ is null then null else PROC_DEF_ID_ end,
case when BUSINESS_KEY_ is null then null else BUSINESS_KEY_ end);
PostgreSQL
Runtime:
alter table ACT_RU_EXECUTION add constraint ACT_UNIQ_RU_BUS_KEY UNIQUE (PROC_DEF_ID_, BUSINESS_KEY_);
History:
alter table ACT_HI_PROCINST add constraint ACT_UNIQ_HI_BUS_KEY UNIQUE (PROC_DEF_ID_, BUSINESS_KEY_);
隔离级别配置
大多数数据库管理系统提供了四种不同的隔离级别可供设置。例如,由ANSI/USO SQL定义的级别是(从低到高的隔离)有:
- 读未提交(READ UNCOMMITTED )
- 不可重复读(READ COMMITTED)
- 可重复读(REPEATABLE READS)
- 串行化(SERIALIZABLE)
运行Camunda所需的隔离级别是 不可重复读(READ COMMITTED) ,根据你的数据库系统不同,它可能有不同的名称。将隔离级别设置为 REPEATABLE READS 会导致死锁,所以在改变隔离级别时需要谨慎。