Camunda引擎的数据库相关操作均基于db模块实现,该模块的代码结构如下。
Entitymanger
Entitymanger主要包含DbEntityManager、DbEntityManagerFactory两个类,并定义了3个接口。.
DbEntityManager
(一)成员变量
DbEntityManager定义了如下主要成员变量:
// 乐观锁监听器
protected List<OptimisticLockingListener> optimisticLockingListeners;
// ID生成器(详见后续章节)
protected IdGenerator idGenerator;
// 数据库实体缓存(详见后续章节)
protected DbEntityCache dbEntityCache;
// 数据库操作管理器(详见后续章节)
protected DbOperationManager dbOperationManager;
// 持久性回话接口,抽象定义了Entity Operations、Schema Operations、listeners
protected PersistenceSession persistenceSession;
其中,PersistenceSession是一个Session接口,抽象定义了Entity Operations、Schema Operations和listeners。
(二)成员方法
- 提供多个重载的列表查询、单个查询、按ID查询方法
- selectById优先查缓存(dbEntityCache),若不存则查数据库
- 当需要访问数据库查询时,均通过PersistenceSession的实现类DbSqlSession实现具体的数据库查询操作,关于DbSqlSession后文再做详细介绍。
- 基于dbEntityCache成员变量,提供针对缓存的写入、删除/撤销删除、强制更新、查询、刷新以及合并方法
- Lock
- Flush:刷新实体缓存,将操作插入到 DB Operations Manager,并刷新dbOperationManager,其本质最终也是基于DbSqlSession实现具体的数据库操作;
- handleConcurrentModification,确定是否可以容忍并发修改失败的操作,或者是否应引发OptimisticLockingException
- canIgnoreHistoryModificationFailure,确定是否可以忽略对Historic实体执行失败的数据库操作(OptimisticLockingException)
- Query Factory Methods,提供DeploymentQueryImpl、ProcessDefinitionQueryImpl、ProcessInstanceQueryImpl、ExecutionQueryImpl、TaskQueryImpl、JobQueryImpl、HistoricProcessInstanceQueryImpl、HistoricActivityInstanceQueryImpl、HistoricTaskInstanceQueryImpl、HistoricDetailQueryImpl等
DbEntityManagerFactory
DbEntityManagerFactory用于实例化DbEntityManager。
Entitymanger.cache
org.camunda.bpm.engine.impl.db.entitymanager.cache的核心服务是DbEntityCache。
DbEntityCache是一个针对DbEntity Entities的单级缓存,主要包含cachedEntity、cacheKeyMapping以及缓存操作方法,同时该模块还定义了DbEntityState:
- cachedEntity即缓存本身:其将实体类型(class)按 id(主键)映射到索引。Camunda引起按类型(class)索引的原因是,一方面不同类型的多个实体可以具有相同的值作为主键。在流程引擎中,TaskEntity 和 HistoricTaskEntity 具有相同的id值,另一方面为了性能;
- cacheKeyMapping在Entitymanger实例化时创建,无特殊配置情况下,使用默认的mapping,具体如下:
DbEntityCacheKeyMapping为DbEntityCache提供用于组织不同DbEntity类型的键。特别是对于多态类型,重要的是它们可以在缓存中的一个公共键下访问,以便使用超类或子类查询缓存时都返回缓存的实体。
DbEntityState定义了DbEntity的几种状态:
State |
说明 |
TRANSIENT |