1.1.1.  activiti默认主键生成方式

;

下面我们看一下主键的生成策略:主键的生成策略定义在IdGenerator接口中,接口定义如下所示:

public interface IdGenerator {
  String getNextId();
}

getNextId()方法定义了主键生成的策略,每次需要主键的时候直接从getNextId()方法中获取即可。

下面看一下IdGenerator接口的实现类,具体的实现结构如下:

1.DbIdGenerator默认的方式,没有依赖第三方jar包。

2.org.activiti.engine.impl.persistence.StrongUuidGenerator类使用的uuid生成主键的策略。依赖第三方包com.fasterxml.uuid.impl.TimeBasedGenerator 使用的时候需要添加jar包。具体的maven仓库如下所示:

<dependency>
<groupId>com.fasterxml.uuid</groupId>
<artifactId>java-uuid-generator</artifactId>
<version>3.1.4</version>
</dependency>

使用的时候,如果没有上面的jar包,程序报错不能使用。

1.1.2. activiti主键生成策略源码初始化分析

首先进入org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl类 查看initIdGenerator() 方法,这个方法是主键生成策略的选定。

protected void initIdGenerator() {
//用户自定义主键生成策略,优先使用自定义生成策略
    if (idGenerator==null) {
      CommandExecutor idGeneratorCommandExecutor = null;
//idGeneratorDataSource专门的主键生成的datasource配置
      if (idGeneratorDataSource!=null) {
        ProcessEngineConfigurationImpl processEngineConfiguration = new StandaloneProcessEngineConfiguration();
        processEngineConfiguration.setDataSource(idGeneratorDataSource);
        processEngineConfiguration.setDatabaseSchemaUpdate(DB_SCHEMA_UPDATE_FALSE);
        processEngineConfiguration.init();
        idGeneratorCommandExecutor = processEngineConfiguration.getCommandExecutor();
      } else if (idGeneratorDataSourceJndiName!=null) {
//jndi方式生成id,

分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519)

        ProcessEngineConfigurationImpl processEngineConfiguration = new StandaloneProcessEngineConfiguration();
        processEngineConfiguration.setDataSourceJndiName(idGeneratorDataSourceJndiName);
        processEngineConfiguration.setDatabaseSchemaUpdate(DB_SCHEMA_UPDATE_FALSE);
        processEngineConfiguration.init();
        idGeneratorCommandExecutor = processEngineConfiguration.getCommandExecutor();
      } else {
        idGeneratorCommandExecutor = getCommandExecutor();
      }
//上面的两种方式都没有使用,则使用默认的主键生成策略
      DbIdGenerator dbIdGenerator = new DbIdGenerator();
      dbIdGenerator.setIdBlockSize(idBlockSize);
      dbIdGenerator.setCommandExecutor(idGeneratorCommandExecutor);
      dbIdGenerator.setCommandConfig(getDefaultCommandConfig().transactionRequiresNew());
      idGenerator = dbIdGenerator;
    }
  }

1.1.3. 自定义IdGenerator生成策略

1.1.3.1. 自定义类

@Service
public class UUIDGenerator implements IdGenerator {
@Override
public String getNextId() {

分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519)

return UUID.randomUUID().toString().replace("-", "");
}
}

1.1.3.2. 配置使用

@Service
public class MyProcessEngineConfigurator  extends AbstractProcessEngineConfigurator{
@Autowired
private UUIDGenerator uUIDGenerator;

分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519)

@Override
public void beforeInit(
ProcessEngineConfigurationImpl processEngineConfiguration) {
DataSource dataSource = JdbcUtils.getReadDataSource();
processEngineConfiguration.setDataSource(dataSource);
processEngineConfiguration.setHistoryLevel(HistoryLevel.FULL);
processEngineConfiguration.setDbIdentityUsed(false);
processEngineConfiguration.setProcessEngineLifecycleListener(myProcessEngineConfigurator);
processEngineConfiguration.setIdGenerator(uUIDGenerator);
}
}

1.1.4. activiti主键策略小结

小结:

1.默认的DbIdGenerator生成策略,数据量不大的情况下,看起来直观一点,可以快速定位要需要查询的视图中。当数据量大的时候,看起来也不直观。

2.默认的DbIdGenerator生成策略,主键的id存储在数据库,缓存中没有的时候,回去查询数据库,所以如果频繁的查询数据库生成主键,不可取。对性能有影响。并发大的时候,此方案不可取。

3.内置的StrongUuidGenerator生成策略,生成的是UUID,缺点:使用的时候需要添加第三方的jar包。感觉没有必要生成uuid的时候,使用第三方工具。

使用自己的uuid生成类,简单明了,可以自己控制生成的策略,不需要第三方的生成工具,直接使用的jdk中的java.util.UUID类。可控性更强。

分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519)

activiti uuid主键的更多相关文章

  1. hibernate annotation 生成uuid主键

    JPA标准方式下,不可以生成uuid类型的主键,但是hibernate提供了一些方式生成uuid主键,具体如下: 1.主键生成器     @GeneratedValue(generator=" ...

  2. MySql中利用insert into select 准备数据uuid主键冲突

    MYSQL 中表1需要准备大量数据,内容主要取自表2,id必须为32位uuid (项目所有表都是这样,没办法), 准备这样插入: INSERT INTO TBL_ONE (ID, SOID, SNAM ...

  3. mybatis 主键UUID生成策略

    <insert id="insert" parameterType="com.lsfwpt.lawmis.po.SysUser"> <sele ...

  4. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)

    测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  5. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)

      主键类型 SQL语句 运行时间 (秒)   (1)模糊范围查询1000条数据,自增ID性能要好于UUID 自增ID SELECT SQL_NO_CACHE t.* FROM test.`UC_US ...

  6. MySQL主键设计

    [TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主 ...

  7. insert主键返回 selectKey使用

    有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了. 这时候,通过一些设置,mybatis可以将insert的数据的主键 ...

  8. Hibernate主键生成策略及选择

    1 .increment:适用于short,int,long作为主键,不是使用数据库自动增长机制 这是hibernate中提供的一种增长机制 在程序运行时,先进行查询:select max(id) f ...

  9. Mybatis里Mapper映射sql文件里insert的主键返回selectKey使用

    有时候新增一条数据,知道新增成功即可,但是有时候,需要这条新增数据的主键,以便逻辑使用,再将其查询出来明显不符合要求,效率也变低了. 这时候,通过一些设置,mybatis可以将insert的数据的主键 ...

随机推荐

  1. [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树

    Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...

  2. CentOS6.9安装

    我安装在VM的虚拟机中.具体安装方式网上很多,由于本机只能安装32位的linux系统,所以悬在了Centsos6.9版本.点此下载. 其中有一种是叫做LIVEDVD的版本,这种的值虚拟机中配置后,打开 ...

  3. 【luogu3174】【HAOI2009】毛毛虫

    Description 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大. Input 在文本文件 worm.in 中第一行两个整数 N , M ,分 ...

  4. poj 1228 稳定凸包

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12337   Accepted: 3451 ...

  5. django rest-framework 1.序列化 一

    上图为项目完整的目录结构 一.入门 需要先安装需要使用到包 pip install django pip install djangorestframework 先来创建一个新项目 django-ad ...

  6. break用法

    break用于循环,则是终止循环 break用于switch,则终止switch break不能用于if.当break用于if语句,但是终止的是if的外部循环 break 只能终止最近的循环

  7. C语言程序第二次作业

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

  8. Fashion-MNIST:A MNIST-like fashion product database. Benchmark

    Zalando的文章图像的一个数据集包括一个训练集6万个例子和一个10,000个例子的测试集. 每个示例是一个28x28灰度图像,与10个类别的标签相关联. 时尚MNIST旨在作为用于基准机器学习算法 ...

  9. 关于Matchvs一些使用心得与建议

    我的项目是类似<贪吃蛇>玩法的一款IO游戏,就是几个玩家在游戏界面中可以吃食物,也可以相互吃,吃了食物或对方都会变大这样子.我是在用cocos creator做完前端开发的部分后,开始接入 ...

  10. 【Java关键字-Interface】为什么Interface中的变量只能是 public static final

    三个关键字在接口中的存在原因:public:接口可以被其他接口继承,也可以被类实现,类与接口.接口与接口可能会形成多层级关系,采用public可以满足变量的访问范围: static:如果变量不是sta ...