前言

近来,在框架中获取数据库执行器时,一直通过参数传递,颇觉繁琐,且不符合设计常理。

故而,思虑片刻,欲将其融入至笔者框架内置的“RequestAttributes”对象中。

此属性对象采用“ThreadLocal”作为线程局部变量同步。

以下是具体的流转思路图

基于以上思路,笔者先创建“ExecutorAttributes”类,将其定义为数据库执行器属性类,并定义“泛型”用于子类实现后可以通过“链式”调用其中内置函数。

其中,内置“数据库执行器”,“是否打开事务”,“是否提交事务”等一些基础函数。

以下,是具体的实现代码

package com.threeox.drivenlibrary.context.attr;import com.threeox.dblibrary.executor.inter.ISqlExecutor;
import com.threeox.drivenlibrary.enums.ResponseResult;
import com.threeox.drivenlibrary.exception.ResponseException;
import com.threeox.utillibrary.logger.LoggerFactory;/*** 数据库执行器属性** @author 赵屈犇* @version 1.0* @date 创建时间: 2022/6/29 21:27*/
public class ExecutorAttributes<T> {protected static final LoggerFactory logger = LoggerFactory.getLogger(ExecutorAttributes.class.getName());/*** 数据库执行器*/private ISqlExecutor executor;/*** 是否打开事务*/private boolean isStartTransaction = false;/*** 是否提交事务*/private boolean isSubmitTransaction = true;/*** 设置是否开启事务** @param startTransaction* @return a* @author 赵屈犇* @date 创建时间: 2022/6/29 21:33* @version 1.0*/public T setStartTransaction(boolean startTransaction) {isStartTransaction = startTransaction;return (T) this;}/*** 设置是否提交事务** @param submitTransaction* @return a* @author 赵屈犇* @date 创建时间: 2022/6/29 21:33* @version 1.0*/public T setSubmitTransaction(boolean submitTransaction) {isSubmitTransaction = submitTransaction;return (T) this;}/*** 设置执行器** @param executor* @return a* @author 赵屈犇* @date 创建时间: 2022/6/29 21:34* @version 1.0*/public T setExecutor(ISqlExecutor executor) {this.executor = executor;return (T) this;}/*** 获取数据库执行器** @return a* @author 赵屈犇* @date 创建时间: 2022/6/29 21:56* @version 1.0*/public ISqlExecutor getExecutor() {return executor;}/*** 开启事务** @return a* @author 赵屈犇* @date 创建时间: 2022/6/29 21:39* @version 1.0*/public T beginTransaction() throws Exception {if (isStartTransaction && executor != null) {executor.beginTransaction();}return (T) this;}/*** 提交事务** @return a* @author 赵屈犇* @date 创建时间: 2022/6/29 22:24* @version 1.0*/public T commit() throws ResponseException {try {if (isStartTransaction && executor != null) {if (isSubmitTransaction) {// 提交事务executor.commit();} else {// 回退事务executor.rollback();}}} catch (Exception e) {logger.error("提交事务异常", e);throw ResponseException.newInstance(ResponseResult.TRANSACTION_ABNORMAL);}return (T) this;}/*** 回退事务** @return a* @author 赵屈犇* @date 创建时间: 2022/6/29 21:48* @version 1.0*/public T rollback() {try {if (isStartTransaction && executor != null) {executor.rollback();}} catch (Exception e1) {logger.error("回退事务异常", e1);}return (T) this;}
}

继而,使此前实现的“RequestAttributes”继承此类,并实现相应处理逻辑

package com.threeox.drivenlibrary.context.attr;import com.alibaba.fastjson.JSONObject;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 请求属性对象** @author 赵屈犇* @version 1.0* @date 创建时间: 2022/4/18 23:56*/
public class RequestAttributes extends ExecutorAttributes<RequestAttributes> {/*** 泛型参数对象*/private Object requestParams;/*** json 请求参数*/private JSONObject paramsJSON;/*** request*/private HttpServletRequest request;/*** response*/private HttpServletResponse response;/*** api属性*/private ApiAttributes apiAttributes;/*** 功能属性*/private FuncAttributes funcAttributes;public static RequestAttributes builder(HttpServletRequest request, HttpServletResponse response) {return new RequestAttributes(request, response);}private RequestAttributes() {}public RequestAttributes(HttpServletRequest request, HttpServletResponse response) {this.request = request;this.response = response;}public <T extends Object> T getRequestParams() {return (T) requestParams;}public JSONObject getParamsJSON() {return paramsJSON;}public RequestAttributes setParamsJSON(JSONObject paramsJSON, Class paramsClass) {this.paramsJSON = paramsJSON;if (paramsJSON != null) {// 获取请求参数泛型对象if (paramsClass != null) {requestParams = paramsJSON.toJavaObject(paramsClass);} else {requestParams = paramsJSON;}}return this;}public HttpServletRequest getRequest() {return request;}public HttpServletResponse getResponse() {return response;}/*** 获取功能属性** @author 赵屈犇* @return* @date 2022/4/20 22:56*/public FuncAttributes func() {if (funcAttributes == null) {funcAttributes = new FuncAttributes();}return funcAttributes;}/*** 获取api属性** @author 赵屈犇* @return* @date 2022/4/21 21:45*/public ApiAttributes api() {if (apiAttributes == null) {apiAttributes = new ApiAttributes();}return apiAttributes;}}

至此,属性对象已成功定义,笔者只需在具体的实现逻辑,调用早前封装的“RequestContextHolder”类,进行数据库执行器相关操作,以“元素事件”请求为例


综上,已实现所有功能,接下来就需要验证一下功能是否完整。

此下视频,是详细的功能实现结果。

ThreadLocal实战之数据库执行器线程同步

ThreadLocal实战之数据库执行器线程同步相关推荐

  1. 多线程实战(二)线程同步

    当多个线程使用共享对象的时候,依次等待,这种我们通常叫着线程同步:下面介绍几种线程同步的方法: 原子操作 Mutex SemaphoreSlim AutoResetEvent ManuualReset ...

  2. 【记录】python多线程的使用 线程同步(LOCK和RLOCK) python与mysql数据库交互实现增加和查找 python的格式化输出

    文章目录 多线程: _thread模块 threading模块: 线程同步(LOCK和RLOCK) 和mysql交互: 附:python的格式化输出 附录 多线程: _thread模块 例一 impo ...

  3. ThreadLocal和线程同步机制的对比

    ThreadLocal和线程同步都是为了解决多线程中相同变量的访问冲突问题,那么,二者的区别在哪里?和线程同步机制对比,ThreadLocal有什么优势? 同步机制中通过对象的锁机制保证同一时间只有一 ...

  4. Mariadb数据库之主从复制同步配置实战

    . Mariadb数据库之主从复制同步配置实战 一.环境规划 二.Mariadb的主从复制介绍 1.主从复制简介 2.半同步复制介绍 3.主从复制原理图 三.安装Mariadb 1.配置yum仓库 2 ...

  5. C#多线程编程实战(二):线程同步

    2.1 简介 竞争条件:多个线程同时使用共享对象.需要同步这些线程使得共享对象的操作能够以正确的顺序执行 线程同步问题:多线程的执行并没有正确的同步,当一个线程执行递增和递减操作时,其他线程需要依次等 ...

  6. java线程同步的实现_Java并发编程(三) - 实战:线程同步的实现

    synchronized关键字 首先,来看一个多线程竞争临界资源导致的同步不安全问题. package com.example.weishj.mytester.concurrency.sync; /* ...

  7. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  9. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

最新文章

  1. 反射 Class类和Class实例
  2. ES6解构赋值学习总结
  3. hdu 多校数论 GuGuFishtion
  4. windows linux 通过SSH X11Forwrding 使用图形化界面
  5. 基于firefly rk3399 Android 7.1实现的ros服务小机器人
  6. 鸟哥的Linux私房菜(基础篇)- 第六章、Linux 的文件权限与目录配置
  7. php调用go服务问题,PHP 调用 Go 服务的正确方式 - Unix Domain Sockets
  8. JZOJ 5924. 【NOIP2018模拟10.23】Queue
  9. MySQL主从复制虽好,能完美解决数据库单点问题吗?
  10. 刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个
  11. 「 Luogu P2574 」 XOR的艺术——线段树
  12. linux防火墙为空文件夹,如何记录Linux IPTables防火墙丢弃的数据包到日志文件-linux防火墙设置...
  13. linux 777权限_认识Linux之Linux命令-用户、权限管理(8)
  14. 我对hibernate的对象的3种状态的理解
  15. Git学习笔记 - 钢钢更新
  16. android sd卡 f2fs,显著提速!谷歌Pixel 3/3 XL使用了三星F2FS文件系统
  17. JAVA中输出姓王的姓名,没出过国的人,不配姓王
  18. MATLAB 中的randn函数
  19. TCGA肿瘤数据分析专题
  20. postman 安装失败 Failed to install the .NET Framework, try installingthe latest version manully

热门文章

  1. Java基础语法(三)——运算符
  2. 如何在javascript中发出http请求?
  3. 华为设备配置Telnet与SSH服务实现运程连接网络设备
  4. 工作中遇到问题以及解决方法
  5. 玩转华为ENSP模拟器系列 | 配置普通NTP对等体模式示例
  6. 码农翻身 各章节链接
  7. 微信公众号自定义菜单直接跳转到小程序指定页面
  8. MySQL的数据类型(一)
  9. 一次线上事故,我顿悟了异步的精髓
  10. 在PPT中显示时间以提醒演讲者控制时间