复杂业务中,统一处理多表操作
来源:互联网 发布:围棋软件知乎 编辑:程序博客网 时间:2024/05/17 07:24
业务背景
在一个复杂的后台业务处理中,总是会出现通过各种逻辑处理过程中,产生对很多表的增删改操作、调用其他模块接口、消息队列等,如果直接边处理边对表修改,则@Transactional事务管理的范围就很大,需要对很多方法添加该注释,为了让事务管理的范围尽量减小,就将所有的需要的操作全部缓存起来,再统一处理。
处理思路
我使用的map<Emun,Collection<T>> 局部变量的方式缓存起来,在分析需求的时候,已经明确了业务会对哪些数据造成变化,使用枚举定义出来,作为map的key,value就是需要对应的表或者消息的内容。
主要代码
增加一条处理记录
调用方法 addElement(map, [key], (T) [element]);
/** * 数据集合中新增元素 * * @param map 数据集合 * @param key * @param element 新元素 * @param <T> */ private <T> void addElement(Map<TableEm, List<T>> map, TableEm key, T element) { if (null == element) { return; } List<T> ts = map.get(key); if (null == ts) { List<T> newTs = new ArrayList<>(); newTs.add(element); map.put(key, newTs); } else { ts.add(element); map.put(key, ts); } }
查重,去重
由于我的业务存在不同的业务会影响同一个表的问题,我的业务唯一健都是recordId,调用方法 ([element]) getElement(map, [key], [primary_key])
private static <T> T getElement(Map<String, List<T>> map, String key, String recordId) { List<T> ts = map.get(key); if (null == ts || ts.isEmpty()) { return null; } for (T t : ts) { Class<?> aClass = t.getClass(); try { Method getRecordIdMethod = aClass.getMethod("getRecordId"); Object id = getRecordIdMethod.invoke(t); if (recordId.equals(id.toString())) { return t; } } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { return null; } } return null; }
统一处理
按前面方法统一获取到之后,统一在一个方法内,注解@Transacal遍历处理map即可;
这种方式,业务处理较为清晰,便于维护,但不知道是否存在其他问题?
阅读全文
1 0
- 复杂业务中,统一处理多表操作
- 业务复杂
- 谁都能建表? —— 业务复杂型系统统一数据源的问题
- 外理多值查询,同时相关业务的复杂处理
- 复杂业务状态的处理:从状态模式到 FSM
- BPM/SOA把业务和技术统一在“服务”中
- spring中对异常的统一处理
- 当遇到处理复杂业务逻辑的情况,使用了hibernate,你是怎么处理的?
- 多类型业务处理技巧
- android开发 用线程进行耗时操作,统一处理
- 业务处理中ACTION的用法小结
- 数据库表的复杂操作
- JVM中复杂对象的原子操作
- android中ListView结合EditText复杂操作
- 多个工作流统一处理返回算法
- 应对复杂的业务逻辑
- 将业务及数据库相关操作放入单独线程处理
- JSP向Action中传表单的统一编码处理。
- MySQL中utf8和utf8mb4的区别
- python 报错Microsoft Visual C++ 14.0 is required
- 今天开始重新学习算法
- Mysql 修改用户密码
- Kotlin编程之三
- 复杂业务中,统一处理多表操作
- BZOJ1833 [ZJOI2010]count 数字计数
- MAVEN创建JAR工程和WAR工程
- Java DecimalFormat 用法
- C内存分配
- 关键路径转化率分析——漏斗模型
- ng2 环境准备/工程目录解构/使用ng-bootstrap /
- opencv 3.0 + visual studio 2017 机器视觉开发环境配置
- 安卓-万能的selector背景点击模板