ThreadLocal实战之数据库执行器线程同步
前言
近来,在框架中获取数据库执行器时,一直通过参数传递,颇觉繁琐,且不符合设计常理。
故而,思虑片刻,欲将其融入至笔者框架内置的“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实战之数据库执行器线程同步相关推荐
- 多线程实战(二)线程同步
当多个线程使用共享对象的时候,依次等待,这种我们通常叫着线程同步:下面介绍几种线程同步的方法: 原子操作 Mutex SemaphoreSlim AutoResetEvent ManuualReset ...
- 【记录】python多线程的使用 线程同步(LOCK和RLOCK) python与mysql数据库交互实现增加和查找 python的格式化输出
文章目录 多线程: _thread模块 threading模块: 线程同步(LOCK和RLOCK) 和mysql交互: 附:python的格式化输出 附录 多线程: _thread模块 例一 impo ...
- ThreadLocal和线程同步机制的对比
ThreadLocal和线程同步都是为了解决多线程中相同变量的访问冲突问题,那么,二者的区别在哪里?和线程同步机制对比,ThreadLocal有什么优势? 同步机制中通过对象的锁机制保证同一时间只有一 ...
- Mariadb数据库之主从复制同步配置实战
. Mariadb数据库之主从复制同步配置实战 一.环境规划 二.Mariadb的主从复制介绍 1.主从复制简介 2.半同步复制介绍 3.主从复制原理图 三.安装Mariadb 1.配置yum仓库 2 ...
- C#多线程编程实战(二):线程同步
2.1 简介 竞争条件:多个线程同时使用共享对象.需要同步这些线程使得共享对象的操作能够以正确的顺序执行 线程同步问题:多线程的执行并没有正确的同步,当一个线程执行递增和递减操作时,其他线程需要依次等 ...
- java线程同步的实现_Java并发编程(三) - 实战:线程同步的实现
synchronized关键字 首先,来看一个多线程竞争临界资源导致的同步不安全问题. package com.example.weishj.mytester.concurrency.sync; /* ...
- 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- Java高级-线程同步机制实现
2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...
- java线程 同步与异步 线程池
1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...
最新文章
- 反射 Class类和Class实例
- ES6解构赋值学习总结
- hdu 多校数论 GuGuFishtion
- windows linux 通过SSH X11Forwrding 使用图形化界面
- 基于firefly rk3399 Android 7.1实现的ros服务小机器人
- 鸟哥的Linux私房菜(基础篇)- 第六章、Linux 的文件权限与目录配置
- php调用go服务问题,PHP 调用 Go 服务的正确方式 - Unix Domain Sockets
- JZOJ 5924. 【NOIP2018模拟10.23】Queue
- MySQL主从复制虽好,能完美解决数据库单点问题吗?
- 刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个
- 「 Luogu P2574 」 XOR的艺术——线段树
- linux防火墙为空文件夹,如何记录Linux IPTables防火墙丢弃的数据包到日志文件-linux防火墙设置...
- linux 777权限_认识Linux之Linux命令-用户、权限管理(8)
- 我对hibernate的对象的3种状态的理解
- Git学习笔记 - 钢钢更新
- android sd卡 f2fs,显著提速!谷歌Pixel 3/3 XL使用了三星F2FS文件系统
- JAVA中输出姓王的姓名,没出过国的人,不配姓王
- MATLAB 中的randn函数
- TCGA肿瘤数据分析专题
- postman 安装失败 Failed to install the .NET Framework, try installingthe latest version manully