`

Activiti缓存机制解析

 
阅读更多

Activiti的持久化和缓存最终都是有DbSqlSession处理的,在此主要也是讲这个对象。类图如下。

public class DbSqlSession implements PersistenOperation, Session {

Java代码  收藏代码
  1.     protected SqlSession sqlSession;  
  2.     protected List<PersistentObject> insertedObjects = new ArrayList<PersistentObject>();  
  3.     protected Map<Class<?>, Map<String, CachedObject>> cachedObjects = new HashMap<Class<?>, Map<String, CachedObject>>();  
  4.     protected List<DeleteOperation> deletedObjects = new ArrayList<DeleteOperation>();  
  5. }  

 首先是insert,这里它使用了一个List对插入对象进行缓存,在通过flush()方法,flush之后最终会使用sqlSession把数据鎚入数据源,sqlSesion是所有对象最终持久化的唯一入口。

delete的作法基本上和inert一样,deltet做多了一层封装DeleteOperation,使用这个对象,适配id进行删除。

 

重点是update,这里update要结合select一起使用。在DbSqlSession对象中,没有update方法,update要求先进行select查询对象,更新查询对象,最终flush()的适合,chched容器会检查最终状态是否和查询时的状态一致,如果不一致,才会进行持久化更新。也就是说,用户只需要查询出对象,使用对象的set方法,更新属性,这样子就会默认进行更新了。在实现的适合注意getPersistentState()的实现,也就是说,会使用到属性更新的属性,需要够着一个判断状态更新的对象让cache容器对比。

flush()的时候,cache容器会先清理掉insert对象和delete对象。

我们看看CachedObject对象的设计。

 

Java代码  收藏代码
  1. public static class CachedObject {  
  2.         protected PersistentObject persistentObject;  
  3.         protected Object persistentObjectState;  
  4.   
  5.         public CachedObject(PersistentObject persistentObject, boolean storeState) {  
  6.             this.persistentObject = persistentObject;  
  7.             if (storeState) {  
  8.                 this.persistentObjectState = persistentObject.getPersistentState();  
  9.             }  
  10.         }  
  11.   
  12.         public PersistentObject getPersistentObject() {  
  13.             return persistentObject;  
  14.         }  
  15.   
  16.         public Object getPersistentObjectState() {  
  17.             return persistentObjectState;  
  18.         }  
  19.     }  

 

 这里可以看明白我们属性设置对比和最终持久。当查询的适合,用storeState = true 构造CachedObject, PersistentState会被保存在对象中。外部API通过select对象的引用更新属性,flush()的适合,会拿最终对象的PersistentState与select出来的对象进行对比,如果不一致,就update数据源记录。代码如下。

 

Java代码  收藏代码
  1. public List<PersistentObject> getUpdatedObjects() {  
  2.        List<PersistentObject> updatedObjects = new ArrayList<PersistentObject>();  
  3.        for (Class<?> clazz : cachedObjects.keySet()) {  
  4.            Map<String, CachedObject> classCache = cachedObjects.get(clazz);  
  5.            for (CachedObject cachedObject : classCache.values()) {  
  6.                PersistentObject persistentObject = cachedObject.getPersistentObject();  
  7.                if (!deletedObjects.contains(persistentObject)) {  
  8.                    Object originalState = cachedObject.getPersistentObjectState();  
  9.                    if (!originalState.equals(persistentObject.getPersistentState())) {  
  10.                        updatedObjects.add(persistentObject);  
  11.                    } else {  
  12.                        log.finest("loaded object '" + persistentObject + "' was not updated");  
  13.                    }  
  14.                }  
  15.            }  
  16.        }  
  17.        return updatedObjects;  
  18.    }  

 

 

到这里,我遇到了一个问题,如果我不使用对象属性更新,也想update数据源记录,显然activiti这一套实现机制是不支持的,那怎么办呢?我的解决办法如下。

 

Java代码  收藏代码
  1. /** 
  2.      * 更新数据,对源码的扩展。 
  3.      * 一般的更新是直接通过Entity对象属性设置。此处暴露出一种直接更新对象的方法。 
  4.      *  
  5.      * @param persistentObject 
  6.      */  
  7.     public void update(PersistentObject persistentObject) {  
  8.         PersistentObject oldPersistentObject = selectById(persistentObject.getClass(), persistentObject.getId());  
  9.           
  10.         //先put对象进缓存容器,再讲持久状态回滚,这样flush的时候,会检查到对象状态变化,进而更新对象。  
  11.         CachedObject cachedObject = cachePut(persistentObject, false);  
  12.         cachedObject.persistentObjectState = oldPersistentObject.getPersistentState();  
  13.     }  

 先用select,保证数据源中的记录已经缓存在cache容器中,跟着强制更新PersistentState。保证flush()的时候可以检查状态的一致性。

 

 

activiti依赖Mybatis,关于缓存机制,Mybatis还有自身的机制,有自己的一套缓存回收机制。activiti默认是不适用Mybatis的缓存的,activiti自身的缓存机制够简单,如果在自身command机制里面适用,性能很高,如果是比较复杂的业务场景,会在结合外部扩展适用的话,很可能就不够用了。所有个人认为可以考虑结合Mybatis的缓存机制,混合适用。

分享到:
评论

相关推荐

    activiti6.0配套源代码

    Activiti 6.0加强了对分布式环境的支持,如使用Hazelcast进行分布式缓存和锁定,这使得Activiti可以在多节点环境中实现高可用性和水平扩展。 7. 工具集成: Activiti 提供了Eclipse插件和Alfresco的集成,方便...

    activiti6.0官方英文文档,需要自取 免费!免费!免费!

    - **缓存机制**:利用缓存机制提高部署速度和效率。 - **配置**:通过设置缓存大小和过期时间来优化缓存行为。 ##### 3.15 日志记录 - **日志级别**:可以根据需要调整日志记录的级别。 - **配置文件**:修改日志...

    Activiti_5.14_用户手册_中文版.doc

    ### Activiti 5.14 用户手册中文版知识点解析 #### 一、简介 - **协议**:Activiti 使用开放源代码许可协议进行分发,这意味着开发者可以自由地使用、修改和分发此软件。 - **下载**:可以从官方网站或其他官方渠道...

    activiti 源码分析

    总之,Activiti 源码分析涉及到流程实例的执行模型、流程部署的数据库交互、查询机制以及数据库操作的管理。理解这些核心概念对于深入学习和定制 Activiti 是至关重要的。通过源码阅读,我们可以更好地掌握 Activiti...

    Activiti5.4+用户指南(中文版).txt

    - 启用缓存机制以提高系统响应速度。 4. **安全性**: - 实现基于角色的访问控制(Role-Based Access Control, RBAC)以保护敏感数据。 - 对外部接口调用进行验证,防止恶意攻击。 5. **监控与调试**: - 利用...

    疯狂Workflow讲义-基于Activiti的工作流应用开发

    本讲义可能涵盖了一些典型的工作流应用场景,如请假审批流程、采购申请流程等,详细解析了如何使用Activiti实现这些流程的自动化。通过案例,读者能更直观地理解Activiti的使用方法和设计原则。 六、最佳实践与注意...

    大数据分析培训机构学习路线.pdf

    最后,课程还包含了一个“易买电商”项目,涉及SpringMVC、MyBatis和SSM框架的运用,包括Ajax与JSON调用、SQL优化、Mapper接口、缓存机制等,全面提高学员在电商项目中的开发能力。 通过这个学习路线,学员不仅能...

    java简历模版4.docx

    5. **ORM与数据库**:熟练运用Hibernate进行持久层开发,理解其ORM实现原理,并能利用缓存机制优化系统性能。 6. **Web开发技术**:掌握JSP、Servlet、JSTL、EL、JDBC和XML编程,以及Oracle和MySQL数据库的使用。 ...

    jeesite-mysql-v5.0.1

    7. **缓存机制**:利用Redis或Memcached等缓存技术,提高数据读取速度,降低数据库压力。 8. **日志记录**:Jeesite通常会结合Log4j或Logback进行日志管理,方便开发者追踪系统运行状态和定位问题。 总的来说,...

    基于SSH框架的oa系统

    它的优点在于减少了手写SQL语句的工作量,同时提供了缓存机制,提高了数据访问效率。 **4. OA系统的特性** 基于SSH框架的OA系统通常具备以下特性: - **模块化设计**:OA系统往往包含人事、财务、审批等多个模块,...

    基于springboot的校园疫情防控系统源码数据库.doc

    同时利用Redis缓存机制减少数据库访问频率,提高响应速度。 4. **教师管理** - **功能概述**:记录教师基本信息及健康状况,便于快速查找和管理。 - **技术实现**:采用Spring Security进行权限控制,确保敏感...

    jeecg-jeecg-boot-master.zip

    3. 安全机制:集成Spring Security,提供了权限管理、登录认证等功能,保障系统的安全性。 4. 数据字典:内置数据字典管理,方便维护系统中的枚举类型,减少硬编码,提升代码可维护性。 5. 工作流引擎:集成...

    基于ASP.NET的基于工作流引擎的项目设计与实现(源代码+项目报告).zip

    在“基于ASP.NET的基于工作流引擎的系统源代码WorkBuffered”中,"WorkBuffered"可能表示工作流缓存或者异步处理机制,这有助于提高系统的性能和响应速度,尤其是在处理大量并发请求时。 此外,项目可能还会涉及到...

    科研成果申报管理系统源码.zip

    《基于Java的科研成果申报管理系统源码解析》 在当今信息化时代,科研管理系统的开发与应用已经成为科研机构不可或缺的一部分。本篇文章将详细解读一个名为"科研成果申报管理系统"的源码,该系统是基于Java编程语言...

    renren-fast开发文档3.0最新版

    8. **Redis缓存**:文档将涵盖如何使用Redis存储session、缓存数据以及实现分布式锁,提高系统性能。 9. **Elasticsearch搜索引擎**:renren-fast利用Elasticsearch进行全文检索,文档会解释如何建立索引、执行查询...

    C# 智能办公系统--源码.

    下面将详细解析这些模块及其技术要点: 1. **用户管理**:系统采用身份验证和授权机制,确保数据安全。这通常涉及到数据库操作,如用户注册、登录、权限分配等,可能使用了ADO.NET或Entity Framework进行数据访问。...

    hrm-parent_java管理系统_系统_

    下面将详细解析该系统的特性和技术实现。 一、系统概述 "hrm-parent"人力资源管理系统是一个基于Java开发的分布式应用,它利用了Java的强大功能和灵活性,以满足现代企业的复杂需求。系统涵盖了招聘、员工信息管理...

Global site tag (gtag.js) - Google Analytics