Filter和 ThreadLocal组合管理事务

从零抓包分析AVDTP:用Wireshark解密蓝牙音频传输全流程 本文详细介绍了如何使用Wireshark抓包工具分析AVDTP协议,解密蓝牙音频传输的全流程。从实验环境搭建到信令交互解析,再到媒体流传输深度分析,逐步揭示蓝牙音频传输的技术本质,帮助开发者深入理解AVDTP协议的工作机制。 阅读详情

Filter和 ThreadLocal组合管理事务

注意!一定要把MySQL的引擎改成InnoDB,只有InnoDB支持事务。创建数据表的时候数据库引擎默认用的是MyISAM不支持事务。

修改my.ini中的default-storage-engine=INNODB

在未修改引擎前创建的表也需要修改引擎设置

alter table table_name engine=innodb;

使用 ThreadLocal 来确保所有 dao 操作都在同一个 Connection 连接对象中完成

在这里插入图片描述

JdbcUtils 工具类的修改

public class JdbcUtils {

    private static DruidDataSource dataSource;
    private static ThreadLocal<Connection> conn = new ThreadLocal<Connection>();

    static {
        Properties properties = new Properties();
        //读取配置文件
        InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
        try {
            //从流中加载数据
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            //创建数据库连接池
            dataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *获取数据库连接池的链接
     * 返回null说明获取连接失败
     */
    public static Connection getConnection(){
        Connection connection = conn.get();
        if(connection==null){
            try {
                connection = dataSource.getConnection();//从数据库连接池获取连接
                conn.set(connection);//保存到threadlocal对象中,供后面的jdbc操作使用
                connection.setAutoCommit(false);//设置为手动管理事务
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return  connection;
    }

    public static void rollBackAndClose() {
        Connection connection = conn.get();
        if(connection!=null){
            try {
                connection.rollback();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void commitAndClose() {
        Connection connection = conn.get();
        if(connection!=null){
            try {
                connection.commit();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        // 一定要执行remove 操作,否则就会出错。(因为Tomcat 服务器底层使用了线程池技术)
        conn.remove();
    }
}

修改 BaseDao

public abstract class BaseDao<T> {

    //使用DbUtils操作数据库
    private QueryRunner queryRunner = new QueryRunner();
    private Class<T> type;

    // 获取T的Class对象,获取泛型的类型,泛型是在被子类继承时才确定
    public BaseDao() {
        // 获取子类的类型
        Class clazz = this.getClass();
        // 获取父类的类型
        // getGenericSuperclass()用来获取当前类的父类的类型
        // ParameterizedType表示的是带泛型的类型
        ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
        // 获取具体的泛型类型 getActualTypeArguments获取具体的泛型的类型
        // 这个方法会返回一个Type的数组
        Type[] types = parameterizedType.getActualTypeArguments();
        // 获取具体的泛型的类型·
        this.type = (Class<T>) types[0];
    }


    /**
     * 执行insert update delete
     * 返回-1说明执行失败
     * 返回其他表示影响的行数
     * @param sql   sql语句
     * @param args  参数
     * @return
     */
    public int update(String sql,Object ... args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.update(connection, sql, args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     *查询返回一个javaBean对象的sql语句
     * @param sql sql语句
     * @param args sql参数
     * @return
     */
    public T queryForOne(String sql,Object ...args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.query(connection, sql, new BeanHandler<T>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     *查询返回多个javaBean对象的sql语句
     * @param sql sql语句
     * @param args sql语句参数
     * @return
     */
    public List<T> queryForList(String sql, Object ...args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return  queryRunner.query(connection, sql, new BeanListHandler<T>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 返回执行一行一列的sql语句
     * @param sql sql语句
     * @param args sql对应的参数值
     * @return
     */
    public Object queryForSingleValue(String sql,Object ...args){
        Connection connection = JdbcUtils.getConnection();
        try {
            return queryRunner.query(connection, sql, new ScalarHandler(), args);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

使用Filter过滤器统一给所有的Service方法都加上try-catch来进行管理

在这里插入图片描述

将所有异常都统一交给Tomcat,让Tomcat展示友好的错误信息页面。

在 web.xml 中我们可以通过错误页面配置来进行管理。

<!--error-page 标签配置,服务器出错之后,自动跳转的页面-->
<error-page>
<!--error-code 是错误类型-->
<error-code>500</error-code>
<!--location 标签表示。要跳转去的页面路径-->
<location>/pages/error/error500.jsp</location>
</error-page>

<!--error-page 标签配置,服务器出错之后,自动跳转的页面-->
<error-page>
<!--error-code 是错误类型-->
<error-code>404</error-code>
<!--location 标签表示。要跳转去的页面路径-->
<location>/pages/error/error404.jsp</location>
</error-page>
016、自动标注方案实战:用大模型(SAM/Grounding DINO)生成 YOLO 格式伪标签 本文介绍了一种利用大模型自动生成YOLO格式伪标签的实战方案。针对传统人工标注效率低、易出错的问题,作者提出结合Grounding DINO(零样本检测)和SAM(精细分割)的优势:前者快速生成候选框,后者优化边界精度。文章详细阐述了技术选型理由(平衡速度与精度)、环境搭建避坑指南(关键依赖版本)、核心三步流程(检测-分割-格式转换)以及后处理技巧(置信度分级过滤)。实验表明,该方案相比纯人工标注可节省80%时间,且经过SAM优化的边界框精度提升10-15%。特别强调了工程细节:文本描述格式、阈值设定、小目 阅读详情

相关推荐

【SOC估算】基于EKF与神经网络融合的锂电池SOC高精度估计及Matlab实现

本文探讨了基于EKF与神经网络融合的锂电池SOC高精度估计方法。通过结合扩展卡尔曼滤波(EKF)的模型驱动优势和神经网络的数据驱动学习能力,实现了对电池荷电状态(SOC)的精准预测。Matlab仿真验证了该混合算法在各种工况下均能显著降低估计误差,提升电池管理系统性能。

play7的博客 694

javaWeb-8-Filter过滤器+ThreadLocal的使用

目录 1、什么是Filter过滤器-API全集 2、Filter的初体验 2.1 Filter过滤器的初体验之要求 2.2 项目结构 2.2.1 在项目的web目录下放置需要访问的资源 2.2.2 编写一个过滤器Filter:AdminFilter implement Filter 2.2.3 编写一个用户处理登录的动态资源处理器Servlet:LoginServlet extends HttpServlet 2.2.4 在web.xml文件中配置Filter的拦截路径和Servlet的访问

风暴计划 1026

ETL基础概念及要求详解

ETL即Extract(抽取)Transform(转换)Load(装载)的过程,如下图,同时也包括数据清洗的部分,是数据从源端到目标端的一个数据处理的过程,是构建数据仓库的重要一环,但不局限于构建数据仓库其他BI(商业智能)的设计和开发数据分析平台也经常用到ETL。

qq_43605229的博客 8942

mybatis-plus动态分表使用ThreadLocal未remove引起的问题

每次请求,tomcat线程会分配线程池进行处理,请求线程任务结束后,线程并不会销毁,而是回收到线程池,线程数据也随之留存,因为在使用threadlocal时,尽量要remove,当然如果是非线程池也可以不remove,但是也会有threadlocal溢出风险。

weixin_43316101的博客 629

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 953

S-function入门及案例详解(1)——S-function基础介绍及基本案例

本专题将用三篇文章对S-function进行介绍及其案例详解。欢迎关注~ 目录一、S-Function简介二、详解sfuntmpl函数2.1 sfuntmpl函数介绍2.2 mdlInitializeSizes函数2.3 mdlDerivatives函数2.4 mdlUpdate函数2.5 mdlOutputs函数2.6 mdlGetTimeOfNextVarHit函数2.7 mdlTerminate函数三、案例1——对波形的幅值进行放大3.1 案例分析3.2 案例详解3.3 输出波形四、案例2——对波形的

Wendy的博客 7万+

使用ThreadLocal请务必remove

场景说明:压测的时候发现调用某个接口同一个入参,返回的商品数据不一致。 使用技术:threadLocal 问题原因:使用ThreadLocal没有remove。 导致问题:1内存溢出,ThreadLocal依赖没有释放,无法GC。 2线程池的某个线程会被反复使用,ThreadLocal的生命周期不等于一次Request的生命周期,造成获取threadLocal内数据异...

lgxzzz的博客 877

时空图神经网络实战:T-GCN在交通流量预测中的深度解析

本文深度解析了时空图神经网络T-GCN在交通流量预测中的实战应用。通过结合图卷积网络(GCN)和门控循环单元(GRU),T-GCN有效捕捉交通数据的时空依赖性,相比传统方法降低30%以上预测误差。文章详细介绍了T-GCN的核心技术、工程实践和优化策略,为智能交通系统提供有力工具。

weixin_29038537的博客 266

Filter过滤器和ThreadLocal和 Filter 和 ThreadLocal 组合管理事务

1、Filter 什么是过滤器 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器 2、Filter 过滤器它是 JavaEE 的规范。也就是接口 3、Filter 过滤器它的作用是:拦截请求,过滤响应。 拦截请求常见的应用场景有: 1、权限检查 2、日记操作 3、事务管理 ……等等 2、Filter 的初体验 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有

Chen_JH001的博客 730

【时时三省】vector cast 常见错误解决/vcast常见错误解决

介绍在使用 vector cast/vcast 软件的过程中,遇到的异常问题。其它异常可以私信解决(购买专栏的前提下)。

时时三省的博客 447

基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论进一步优化建议需求分析电励磁同步电动机

MHD0815的博客 266

Springboot实现拦截器与过滤器

概述 Springboot实现拦截器与过滤器的方法网上很多文章,本文主要阐述实际实现拦截器过程中踩的一下坑. 1.拦截器 1.1.创建拦截器 1.1.1 实现HandlerInterceptor package com.qihang.springdemo.interceptor; import com.qihang.springdemo.threadlocal.LoginInfoContext; import com.qihang.springdemo.threadlocal.LoginThreadLo

qq_41999004的博客 1942

ZYNQ PS裸机开发RS485

RS485 是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上,这使得多个节点可以相互连接。RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。

baidu_34971492的博客 829

Javaweb中的ThreadLocal以及使用Filter和ThreadLocal组合管理事务

Javaweb中ThreadLocal以及使用Filter和ThreadLocal组合管理事务一、ThreadLocal1.什么是ThreadLocal?2.ThreadLocal的作用?3.ThreadLocal的特点二、ThreadLocal的使用三、使用Filter和ThreadLocal组合管理事务1.事务管理2.如何确保所有操作都使用同一个Connection连接对象?3.ThreadLocal的使用4.事务的提交5.使用Filter过滤器统一给所有的Service方法都加上try-catch。来

weixin_44374938的博客 802

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

使用 Filter 和 ThreadLocal 组合管理事务

使用 ThreadLocal 来确保所有 dao 操作都在同一个 Connection 连接对象中完成 手写的JdbcUtils 工具类的修改: public class JdbcUtils { private static DruidDataSource dataSource ; private static ThreadLocal<Connection> conns = ne...

他 347

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用Filter和ThreadLocal组合管理事务

一、ThreadLocal的使用 ThreadLocal的作用可以解决多线程的数据安全问题。 ThreadLocal可以给当前线程关联一个数据,这个数据可以是普通变量、对象、数组、集合等。相当于Map一样存取数据,key为当前线程。 每个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLocal对象实例。 每个ThreadLocal对象实例定义的时候,一般都是static类型。 ThreadLocal中保存的数据,在线程先销毁后,会由JVM虚

qq_39794062的博客 452

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

使用Filter与ThreadLocal组合管理事务

ThreadLocal存储数据库Connection连接对象 为了保证事务的一致性,我们要使用数据库事务管理操作。 回顾一下jdbc的事务管理: Connection conn = JDBCUtils.getConnection(); try{ //取消自动提交事务,手动提交 conn.setAutoCommit(false); //... ... //执行了 一系列jdbc操作 //...

eddie's Blog 259

javaweb——事务(ThreadLocal、Filter组合管理)

1. ThreadLocal ThreadLocal ——可解决多线程的数据安全问题。ThreadLocal可给当前线程关联一个任意类型纪数据(可以是基本类型、引用类型) ThreadLocal 特点: ThreadLocal 可以为当前线程关联一个数据。 (可以像 Map 一样存取数据, key 为当前线程) 每一个 ThreadLocal 对象, 只能为当前线程关联一个数据, 如果要为当前线程关联多个数据, 就需要使用多个ThreadLocal 对象实例。 每个 ThreadLocal 对象实例定义的

m0_38140207的博客 290

项目阶段七:使用 Filter 和 ThreadLocal 组合管理事务

1、使用 ThreadLocal 来确保所有 dao 操作都在同一个 Connection 连接对象中完成 原理分析图: JdbcUtils 工具类的修改: public class JdbcUtils { private static DruidDataSource dataSource; private static ThreadLocal<Connection> conns = new ThreadLocal<Connection>(); /*

qq_45554909的博客 300

Day121.简单书城项目---第八阶段【权限拦截、错误管理、组合管理事务】 -JavaWeb

书城第八阶段: 一、使用 Filter 过滤器拦截/pages/manager/所有内容,实现权限检查 Filter 代码: public class ManagerFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException

阿昌爱Java 413

ThreadLocal的使用与如何使用ThreadLocal去管理事务

ThreadLocal的使用 ThreadLocal 的作用:它可以解决多线程的数据安全问题。 ThreadLocal 它可以给当前线程关联一个数据(一个value)(可以是普通变量,可以是对象,也可以是数组,集合),此数据只能在当前线程中获取。 ThreadLocal 的特点: ThreadLocal 可以为当前线程关联一个数据(一个value)。(它可以像Map 一样存取数据,key为当前ThreadLocal实例) 每一个ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联

i_am_handsome_的博客 899

Filter过滤器使用以及和ThreadLocal的搭配使用

Filter过滤器 什么是Filter过滤器? 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器 2、Filter 过滤器它是 JavaEE 的规范。也就是接口 3、Filter 过滤器它的作用是:拦截请求,过滤响应。 拦截请求常见的应用场景有: 1、权限检查 2、日记操作 3、事务管理 ……等等 初始Filter过滤器 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源

weixin_46744534的博客 2129

JavaWeb学习笔记(五)Filter、ThreadLocal

Filter、ThreadLocal

weixin_43174141的博客 301

JavaWeb学习——ThreadLocal

目录 一、ThreadLocal的使用 二、使用 Filter 和 ThreadLocal 组合管理事务 1、使用 ThreadLocal 来确保所有 dao 操作都在同一个 Connection 连接对象中完成 2、使用 Filter 过滤器统一给所有的 Service 方法都加上 try-catch。来进行实现的管理。 一、ThreadLocal的使用 ThreadLocal 的作用,它可以解决多线程的数据安全问题。 ThreadLocal 它可以给当前线程关联一个数据(可以是普通变.

weixin_45890771的博客 1041

JavaWeb笔记(8):Filter过滤器/ThreadLocal

·

mingyuli的博客 1986

书城项目第八阶段:使用Filter过滤器实现后台的权限管理

书城项目第八阶段:使用Filter过滤器实现后台的权限管理

小心星的博客 1154
上一篇: ThreadLocal
下一篇: JSON.
Sancean
博客等级 码龄6年 2472粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值