ThreadLocal简单使用案例
业务场景:保存业务数据表的时候,同时记录下日志。
import java.sql.Connection;
import java.sql.DriverManager;public class DBUtil {// 数据库配置private static final String driver = "com.mysql.jdbc.Driver";private static final String url = "jdbc:mysql://localhost:3306/test";private static final String username = "root";private static final String password = "root";private static Connection conn = null;public static Connection getDbConnection() {try {Class.forName(driver);conn = DriverManager.getConnection(url, username, password);} catch (Exception e) {e.printStackTrace();}return conn;}// 关闭数据库连接public static void closeDbConnection() {try {if (conn != null) {conn.close();}} catch (Exception e) {e.printStackTrace();}}
}
import com.example.springboottest.util.DBUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Date;public class ThreadLocalTest3 {private static final String UPDATE_SQL = "update t_test set num = ? where id = ?";private static final String INSERT_SQL = "insert into log (id, desc) values (?, ?)";public static void main(String[] args) {ThreadLocalTest3 service = new ThreadLocalTest3();service.updateBusiness(1, 3000);}public void updateBusiness(int id, int num) {try {// 获取连接Connection conn = DBUtil.getDbConnection();conn.setAutoCommit(false); // 关闭自动提交事务(开启事务)// 执行操作updateBizData(conn, UPDATE_SQL, id, num);// 插入日志insertLog(conn, INSERT_SQL, "描述"); // 提交事务conn.commit();} catch (Exception e) {e.printStackTrace();} finally {// 关闭连接DBUtil.closeDbConnection();}}private void updateBizData(Connection conn, String updateSQL, int id, int num) throws Exception {PreparedStatement pstmt = conn.prepareStatement(updateSQL);pstmt.setInt(1, id);pstmt.setLong(2, num);int rows = pstmt.executeUpdate();if (rows != 0) {System.out.println("业务数据更新成功!");}}private void insertLog(Connection conn, String insertSQL, String desc) throws Exception {PreparedStatement pstmt = conn.prepareStatement(insertSQL);pstmt.setString(1, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(new Date()));pstmt.setString(2, desc);int rows = pstmt.executeUpdate();if (rows != 0) {System.out.println("日志插入成功!");}}
}
上面的代码直接运行肯定是没有问题的,但是如果在多线程下面去跑,就会报数据库连接关闭的错误。原因很简单,多线程下执行,可能一个线程刚获取到连接另一个线程就已经把连接关闭了,所以就会导致这样的问题,要解决这个问题,ThreaLocal就是一个很好的选择,只需要改调整下DBUtil里面获取连接的代码即可。如下代码所示:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DBUtil {// 数据库配置private static final String driver = "com.mysql.jdbc.Driver";private static final String url = "jdbc:mysql://localhost:3306/test";private static final String username = "root";private static final String password = "root";private static ThreadLocal<Connection> connContainer = new ThreadLocal<Connection>(){//初始化connContainer里面的值,如果不重写则为null;@Overrideprotected Connection initialValue() {try {Class.forName(driver);return DriverManager.getConnection(url, username, password);} catch (SQLException e) {throw new RuntimeException(e);}}};// 获取连接public static Connection getDbConnection() {Connection conn = connContainer.get();try {if (conn == null) {Class.forName(driver);conn = DriverManager.getConnection(url, username, password);}} catch (Exception e) {e.printStackTrace();} finally {connContainer.set(conn);}return conn;}// 关闭连接public static void closeDbConnection() {Connection conn = connContainer.get();try {if (conn != null) {conn.close();}} catch (Exception e) {e.printStackTrace();} finally {connContainer.remove();}}
}
相关文章:
ThreadLocal简单使用案例
业务场景:保存业务数据表的时候,同时记录下日志。 import java.sql.Connection; import java.sql.DriverManager;public class DBUtil {// 数据库配置private static final String driver "com.mysql.jdbc.Driver";private static final Stri…...
创建型设计模式之建造者模式
文章目录 概述定义建造者模式原理结构图小结 概述 建造者模式又被称为生成器模式,是一种创建型设计模式。 和之前的单例,工厂一样,同属于创建型设计模式。 定义 建造者模式是将一个复杂对象的构建与表示分离,使得同样的构建过程…...
mainwindow 无菜单栏 可拖动,边界可扩大,动画浮现上边框
mainwindow 无菜单栏 可拖动,边界可扩大,动画浮现上边框 #ifndef ANIMATIONWIN_H #define ANIMATIONWIN_H #include namespace Ui {class animationWin; } class animationWin : public QWidget {Q_OBJECT public: explicit animationWin(QWidget *parent = nullptr); …...
机器学习云环境测试
等待创建完成后,点击 PyTorch 打开,创建一个全新的 notebook 在 Cell 中输入如下代码,并点击 Run 完成后点击 New Cell ,在 New Cell 中输入如下代码 输入完成后点击 Run ,运行 New Cell 。(每个 Cell 代…...
扩散模型自动管道AutoPipeline
推荐:write_own_pipeline.ipynb - Colab (google.com) 为您的任务选择一个 AutoPipeline 首先选择一个检查点。例如,如果您对使用 runwayml/stable-diffusion-v1-5 检查点的文本到图像感兴趣,请使用 AutoPipelineForText2Image: f…...
Map六种遍历方式
下面是三组(6种),Map 遍历方式的核心代码。 遍历方式有使用到增强for和迭代器。最下面有张图片,对做题有参考意义。 参考代码: Map map new HashMap();map.put("小猫","cat");map.put("小…...
集合-1 数组ArrayListLinkedList
一.数组 1.什么是数组? 数组是一种用连续的内存空间存储相同类型数据的线性数据结构。 2.为什么数组下标是从0开始? (1)数组根据下标查找元素是基于寻址公式:元素地址数组首地址索引i*数组存储数据类型的大小 &am…...
42-1 应急响应之账户排查
一、用户信息排查 在服务器被入侵后,攻击者可能会建立相关账户(有时是隐藏或克隆账户),方便进行远程控制。攻击者会采用的方法主要有如下几种: 直接建立一个新的账户:攻击者直接创建一个新的账户,有时为了混淆视听,账户名称与系统常用名称相似。 激活一个系统中的默认…...
Python3 笔记:sort() 和 sorted() 的区别
1、sort() 可以对列表中的元素进行排序,会改变原列表,之前的顺序不复存在。 list.sort(key, reverse None) key:默认值是None,可指定项目进行排序,此参数可省略。 reverse&#…...
vue 引入 emoji 表情包
vue 引入 emoji 表情包 一、安装二、组件内使用 一、安装 npm install --save emoji-mart-vue二、组件内使用 import { Picker } from "emoji-mart-vue"; //引入组件<picker :include"[people,Smileys]" :showSearch"false" :showPreview&q…...
mysql 数据库 增量备份
mysql 数据库 增量备份 https://dev.mysql.com/doc/mysql-enterprise-backup/8.0/en/mysqlbackup.incremental.html 和版本 有关系啊 xtrabackup mysql增量备份与恢复使用详解 https://www.jb51.net/database/297844fzd.htm 存储 引擎 怎么看? 适用于MyISAM存储引…...
SpringBoot之@Builder 注解
(1)Builder 生成的构造器不是完美的,如果没有提供必须的参数,构造器可能会创建出不完整或者不合法的对象,导致代码报错。 Builder 注解产生的 Builder 类的构造方法默认并不能限定必传参数。 (2ÿ…...
云计算的能源消耗如何影响环境?
嗨,亲爱的读者朋友们,今天我们要聊一聊云计算的能源消耗对环境的影响。随着科技的飞速发展,云计算已经成为了企业和个人处理数据的首选方式。但是,你可曾想过,这些“云”究竟消耗了多少能源,对我们的环境又…...
openwrt设置开机自启 tailscale为例
首先下载 tailscale 到 /root 目录下,并按照以下命令运行一次 /root/tailscale/tailscaled --state/root/tailscale/tailscaled.state & /root/tailscale/tailscale up &弹出登录地址并授权即可 创建一个启动脚本位置在/etc/init.d下 vim /etc/init.d/ta…...
副业树洞聊天项目/树洞倾诉/陪陪系统源码/树洞源码下载搭建
随着社会的发展和人们生活水平的提高,越来越多的人在面临心理压力、情感困扰或生活困境时,需要一个可以宣泄、倾诉和寻求支持的平台。而传统的人际交往方式往往会遇到难以排解的问题,比如担心被他人知晓自己的隐私等,这就导致了人…...
UWB论文:Introduction to Impulse Radio UWB Seamless Access Systems(2):脉冲;超宽带;测距;定位
3) 测距/接收器 像全球定位系统(GPS)这样的系统依赖于单向测距One Way Ranging(OWR),其中多个卫星(代表固定节点,称为锚点anchors)定期传输同步的无线电数据包集合,这允许…...
Spring MVC/Web
1.Spring MVC 的介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,也是Spring框架的一部分。它提供了灵活可扩展的MVC架构,方便开发者构建高性能的Web应用程序,并与 Spring 生态系统无缝集成。 2.MVC 设计模式 MVC(Model…...
C++中获取int最大与最小值(补)
上文中,我们学习了C中获取int最大与最小值的两种方法:C库和移位运算,这篇文章将解决在移位运算中遇到的各种报错,并提出一种新的生成int最值的方法 上文链接:http://t.csdnimg.cn/cn7Ad 移位运算取最值常见报错 Dev…...
一个开源的工具类轮子是怎么造出来的
心路历程 为什么要做 在22年9月的某一天,在公司开需求评审时,接到了一个给PDF、图片添加水印的需求。做为一个刚工作的CURD程序员,在遇到这些问题时,第一反应是去github上找找有没有类似的开源框架。但是,出乎我意料…...
零基础学Java第二十二天之迭代器 Iterator
迭代器 Iterator 的理解和相关集合 使用 1、理解 迭代器(Iterator)是设计模式中的一种,它允许程序员遍历容器(例如列表、集合等)中的元素,而无需了解容器底层的实现细节。在编程中,迭代器提供了…...
数采网关的应用与特点
摘要在工业自动化、智能制造和物联网(IoT)快速发展的背景下,数据采集网关(数采网关)作为连接现场设备与上层管理系统的关键枢纽,发挥着至关重要的作用。它能够实现工业设备数据的实时采集、协议转换、边缘计…...
人工智能在科学领域需要设立防护措施,避免对它不加批判地采用
耶鲁大学人类学研究生院主任Lisa Messeri、和普林斯顿大学的心理学家M. J. Crockett 发给《自然》期刊的论文中阐述:人工智能正在迅速加速科学产出,但也有可能缩小研究范围,削弱判断力,削弱科学家的培训方式。科学界正以惊人的速度…...
吃透Agent Runtime九大核心设计,从基础跑通到工业级稳定落地
在当下人工智能飞速发展的时代,智能Agent已经成为大模型落地应用最主流的形态之一。从日常智能问答,自动化办公脚本,到复杂的项目工程自主开发,业务流程自主运维,各行各业都在尝试借助Agent解放人力成本,提…...
技术选型翻车实录:我们选的那个框架,两年后停止维护了
一、惊魂一刻:框架停更的暴击“紧急通知,我们一直使用的XX测试框架将于本月底停止维护!”当这条消息出现在团队工作群时,整个测试部瞬间陷入死寂。作为一家中型电商企业的测试负责人,我清楚地知道,这个框架…...
免费图片去水印工具有哪些?2026年在线网站、APP软件完整盘点与推荐
处理图片水印已经成为很多工作和生活场景的常见需求。无论是自媒体运营者整理素材、设计师进行后期处理,还是普通用户保存喜欢的图片,找到一个好用的去水印工具都能显著提高效率。在2026年,市场上涌现出许多免费的图片去水印工具,…...
2026最新免费在线去水印软件推荐:性能对比与选择指南
在2026年,处理视频和图片水印已经成为内容创作者和日常用户的常见需求。无论是社交媒体截图、下载的素材,还是自己录制的视频,水印往往会影响最终的呈现效果。那么,免费在线去水印软件哪个好?不同工具间的优缺点对比如…...
基于i.MX8M Plus与5G的高性能AI边缘计算网关设计与实践
1. 项目概述:为什么我们需要一个“会思考”的边缘网关?在工业现场待久了,你一定会对几个场景深有感触:产线上几十台PLC和传感器,协议五花八门,Modbus、Profibus、CANopen,想统一采集数据得接一堆…...
前端架构演进:从单体到微前端
前端架构演进:从单体到微前端 前端架构的发展历程 第一阶段:单体应用(Mono Repo) ├── src/ │ ├── components/ │ ├── pages/ │ ├── services/ │ ├── utils/ │ └── styles/ └── index.html…...
鸿蒙生鲜电商页面构建:果蔬配送模块的声明式UI实践
鸿蒙生鲜电商页面构建:果蔬配送模块的声明式UI实践 前言 在 HarmonyOS 6.0 应用开发中,生鲜电商类页面的核心挑战在于如何高效展示商品分类、秒杀活动和商品列表,同时保持视觉吸引力。本文将以“鲜选菜篮”生鲜配送应用的主页面为例ÿ…...
2026年免费照片去水印软件App排行榜|去水印App推荐和评测指南
照片被水印困扰是很多用户的常见问题。无论是保存网络上的精美图片、处理工作资料,还是制作个人素材库,去水印都是一个实用的需求。本篇文章根据2026年最新的工具体验,为你梳理免费照片去水印软件app有哪些、各类去水印App怎么选择࿰…...
