Spring中sequence的使用小结

本文详细介绍了SQL序列号(sequence)的概念及其在Oracle数据库中的创建与使用方法,包括如何通过CURRVAL和NEXTVAL获取当前和下一个序列值。进一步阐述了在Spring框架中配置和使用序列号的步骤,提供了具体的XML配置示例和代码实现,以便于在实际项目中集成序列号生成功能。

1).简单介绍

sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
  1、 create sequence
  你首先要有create sequence或者create any sequence权限
  create sequence emp_sequence
  INCREMENT BY 1 -- 每次加几个
  START WITH 1 -- 从1开始计数
  NOMAXVALUE -- 不设置最大值
  NOCYCLE -- 一直累加,不循环
  CACHE 10;
  一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
  CURRVAL=返回sequence的当前值
  NEXTVAL=增加sequence的值,然后返回sequence值
  比如:
  emp_sequence.CURRVAL
  emp_sequence.NEXTVAL
  可以使用sequence的地方:
  - 不包含子查询、snapshot、VIEW的 SELECT 语句
  - INSERT语句的子查询中
  - NSERT语句的VALUES中
  - UPDATE 的 SET中
  可以看如下例子:
  INSERT INTO emp VALUES
  (empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
  SELECT empseq.currval FROM DUAL;
  但是要注意的是:
  - 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。
  - 如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。
  cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
  2、 Alter sequence
  你或者是该sequence的owner,或者有ALTER ANY sequence权限才能改动sequence。 可以alter除start值之外的所有sequence参数。如果想要改变start值,必须drop sequence再re-create。例子:
  ALTER sequence emp_sequence
  INCREMENT BY 10
  MAXVALUE 10000
  CYCLE -- 到10000后从头开始
  NOCACHE;
  影响sequence的初始化参数:
  sequence_CACHE_ENTRIES =
  设置能同时被cache的sequence数目。
  可以很简单的Drop sequence
  DROP sequence order_seq;



2).在Spring的applicationContext中配置sequence
先要配置好一个dataSource,再配置sequence。如下,其中“SQ_AUTHFLOW”是需要使用的sequence的名字
	<!-- 配置Orcale/sequence -->
	<bean id="sequence"
		class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer">
		<property name="incrementerName" value="SQ_AUTHFLOW" />
		<property name="dataSource" ref="dataSource" />
	</bean>


3).在程序中使用实例
public class TAuthFlowDAOImp implements TAuthFlowDAO {	
	private OracleSequenceMaxValueIncrementer sequence;
	public OracleSequenceMaxValueIncrementer getSequence() {
		return sequence;
	}
	public void setSequence(OracleSequenceMaxValueIncrementer sequence) {
		this.sequence = sequence;
	}	
	public String save(final TAuthFlow tAuthFlow) {		
		..
		..
		OracleSequenceMaxValueIncrementer sequence = (OracleSequenceMaxValueIncrementer) AppContext.appContext.getBean("sequence");
		String irc = String.valueOf(sequence.nextIntValue());
		irc = StringUtils.leftPad(irc, 12, "0");  //将irc不足补0成为12位字符串
		SimpleDateFormat sdf11 = new SimpleDateFormat("yyyyMMdd");
		String NowDate = sdf11.format(new Date());
		String SeqNo = NowDate + irc;
		final String IfSvrFlow = SeqNo;
		..
		..
		return SeqNo;		
	}
}
其中AppContext.appContext.getBean("sequence")是另写的一个一次定义其后多次应用。


Spring框架中集成工作流引擎,通常是为了实现业务流程的自动化和管理。常见的工作流引擎包括 **Activiti** 和 **Flowable**,它们都可以与Spring框架无缝集成,并通过Spring的依赖注入、事务管理等特性增强工作流的开发效率和稳定性。 ### 集成方法概述 1. **引入依赖** 在Spring项目中,首先需要引入相应的工作流引擎依赖。例如,使用Maven构建项目时,在`pom.xml`中添加如下依赖(以Activiti为例): ```xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </dependency> ``` 类似地,若使用Flowable,则可以引入: ```xml <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.7.2</version> </dependency> ``` 2. **配置数据源** 工作流引擎需要与数据库进行交互,因此需要配置数据库连接。以MySQL为例,在`application.properties`中配置如下内容: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/activiti?useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 3. **流程定义与部署** 使用BPMN 2.0标准定义流程模型,并将其部署到工作流引擎中。例如,通过Activiti的API部署流程: ```java @Autowired private RepositoryService repositoryService; public void deployProcess() { Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/leave-request.bpmn20.xml") .deploy(); System.out.println("Deployment ID: " + deployment.getId()); } ``` 4. **流程实例启动** 在部署流程后,可以通过流程定义的key启动流程实例: ```java @Autowired private RuntimeService runtimeService; public void startProcessInstance() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest"); System.out.println("Process Instance ID: " + processInstance.getId()); } ``` 5. **任务处理与流程推进** 用户任务可以通过任务服务(`TaskService`)进行处理: ```java @Autowired private TaskService taskService; public void completeTask(String taskId) { taskService.complete(taskId); } ``` 6. **权限控制与安全集成** 可以结合Spring Security实现基于角色的任务访问控制。例如,限制只有特定角色的用户才能处理某类任务: ```java @PreAuthorize("hasRole('MANAGER')") public void approveLeaveRequest(String taskId) { taskService.complete(taskId); } ``` 7. **流程监控与管理** 通过`HistoryService`和`ManagementService`可以监控流程实例的状态、任务完成情况等: ```java @Autowired private HistoryService historyService; public void getHistoricProcessInstances() { List<HistoricProcessInstance> instances = historyService.createHistoricProcessInstanceQuery().list(); for (HistoricProcessInstance instance : instances) { System.out.println("Process Instance ID: " + instance.getId()); } } ``` ### 示例:简单的工作流实现 以请假申请为例,定义一个包含两个用户任务的BPMN流程:提交申请 → 审批。 流程定义文件 `leave-request.bpmn20.xml`: ```xml <process id="leaveRequest" name="Leave Request Process"> <startEvent id="startEvent" name="Start"></startEvent> <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="submitLeaveRequest" /> <userTask id="submitLeaveRequest" name="Submit Leave Request" activiti:assignee="employee" /> <sequenceFlow id="flow2" sourceRef="submitLeaveRequest" targetRef="approveLeaveRequest" /> <userTask id="approveLeaveRequest" name="Approve Leave Request" activiti:assignee="manager" /> <sequenceFlow id="flow3" sourceRef="approveLeaveRequest" targetRef="endEvent" /> <endEvent id="endEvent" name="End"></endEvent> </process> ``` 对应的Spring Boot服务类: ```java @Service public class LeaveRequestService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; public void startLeaveProcess() { runtimeService.startProcessInstanceByKey("leaveRequest"); } public void submitLeaveRequest(String processInstanceId) { List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstanceId) .taskAssignee("employee") .list(); if (!tasks.isEmpty()) { taskService.complete(tasks.get(0).getId()); } } public void approveLeaveRequest(String processInstanceId) { List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstanceId) .taskAssignee("manager") .list(); if (!tasks.isEmpty()) { taskService.complete(tasks.get(0).getId()); } } } ``` ### 总结 在Spring框架中集成工作流引擎,可以借助其模块化设计和Spring的特性,实现灵活、可维护的业务流程管理。无论是Activiti还是Flowable,它们都提供了丰富的API和工具支持,开发者可以根据项目需求选择合适的工作流引擎[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值