activiti uuid主键

简介: 1.1.1.  activiti默认主键生成方式分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519)activiti中默认的主键生成的方式是:每次从activiti 数据库表 act_ge_property中的next.dbid属性中取值,然后加上自定义的步长。

1.1.1.  activiti默认主键生成方式

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

activiti中默认的主键生成的方式是:每次从activiti 数据库表 act_ge_property中的next.dbid属性中取值,然后加上自定义的步长。新的值=act_ge_property中的next.dbid值+步长。当然了步长可以自定义,在activiti5.19中步长默认是protected int idBlockSize = 2500;

下面我们看一下主键的生成策略:主键的生成策略定义在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)


相关文章
|
1月前
|
Java 数据库连接 mybatis
Mybatis Plus保存数据返回主键id
Mybatis Plus保存数据返回主键id
25 1
|
Java 数据库
如何使用JPA的UUID主键生成策略
这篇文章只写给主键用uuid并且用jpa的小伙伴。 1. 数据实体类 @Entity @Table(name = "ip_user") @GenericGenerator(name = "jpa-uuid", strategy = "uuid") ...
3475 0
|
7月前
|
XML Java 数据库连接
【MySQL用法】MyBatis 多对多 中间表插入数据,添加记录后获取主键ID
【MySQL用法】MyBatis 多对多 中间表插入数据,添加记录后获取主键ID
68 0
|
5月前
|
存储 数据库
elasticsearch 主键生成策略以及如何指定特定字段为id主键列
elasticsearch 主键生成策略以及如何指定特定字段为id主键列
294 0
|
6月前
|
SQL 算法 关系型数据库
Mybatis-Plus3.0默认主键策略导致自动生成19位长度主键id的坑
Mybatis-Plus3.0默认主键策略导致自动生成19位长度主键id的坑
25 0
|
10月前
|
Java 数据库连接 mybatis
mybatis获取insert后的主键id
主要是添加:useGeneratedKeys="true" keyProperty="id" keyColumn="id"。
104 0
|
10月前
|
SQL Java 数据库
spring boot CRUD(查询全部,查询ID,模糊查询,删除id,全部删除,新增多条/单条 修改)(一)
spring boot CRUD(查询全部,查询ID,模糊查询,删除id,全部删除,新增多条/单条 修改)(一)
133 0
|
10月前
|
Java Spring
spring boot CRUD(查询全部,查询ID,模糊查询,删除id,全部删除,新增多条/单条 修改)(二)
spring boot CRUD(查询全部,查询ID,模糊查询,删除id,全部删除,新增多条/单条 修改)(二)
87 0
|
前端开发 Java 数据库连接
Mybatis获取自增长的主键id
Mybatis获取自增长的主键id
Mybatis获取自增长的主键id
|
算法 NoSQL 数据库
【mybatis-plus】主键id生成、字段自动填充
【mybatis-plus】主键id生成、字段自动填充
【mybatis-plus】主键id生成、字段自动填充