一、对于HTTP事务的理解

一次HTTP请求,就是一个事务。事务者,必须完整的执行其中的所有步骤,不能中断。

二、HTTP事务的隔离

每次HTTP请求对应一个HTTP事务,而每个请求都对应一个线程,线程之间相互隔离,没有共享数据,这就是ThreadLocal一个典型的应用场景。

三、ThreadLocal在Web容器中的使用场景【针对HTTP事务】

ThreadLocal充当Web容器中存储Session的载体。当请求到来时,将当前Session信息存储在ThreadLocal中,在请求处理过程中可以随时使用Session信息,每个请求之间的Session信息互不影响。当请求处理完成后通过remove方法将当前Session信息清除即可。

四、ThreadLocal在Spring容器中的使用场景【针对JDBC事务】

Spring框架在事务开始时会给当前线程绑定一个Jdbc Connection,在整个事务过程都是使用该线程绑定的Connection来执行数据库操作,实现了事务的隔离性。

五、日志打印

同一线程的日志一起打印,或者说一次事务的日志一起打印,因为一般默认一次事务都是由同一个线程执行的,将事务的日志保存在线程局部变量当中,当事务执行完成的时候统一打印。

public class ErrorContext

{

    private static final String LINE_SEPARATOR = System.getProperty("line.separator", "\n");

    private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<ErrorContext>();

    private String message;

    private ErrorContext()

    {

    }

    public static ErrorContext instance()

    {

        ErrorContext context = LOCAL.get();

        if (context == null)

        {

            context = new ErrorContext();

            LOCAL.set(context);

        }

        return context;

    }

    public ErrorContext message(String message)

    {

        this.message = message;

        return this;

    }

    public ErrorContext reset()

    {

        message = null;

        LOCAL.remove();

        return this;

    }

    @Override

    public String toString()

    {

        StringBuilder description = new StringBuilder();

        if (this.message != null)

        {

            description.append("### ");

            description.append(this.message);

            description.append(LINE_SEPARATOR);

        }

        return description.toString();

    }

    public static void main(String[] args)

    {

        Runnable task1 = () -> {

            ErrorContext cxt = ErrorContext.instance();

            cxt.message("info");

            System.out.println(cxt);

            cxt.reset();

        };

        Runnable task2 = () -> {

            ErrorContext cxt = ErrorContext.instance();

            cxt.message("error");

            System.out.println(cxt);

            cxt.reset();

        };

        new Thread(task1).start();

        new Thread(task2).start();

    }

}

六、参考内容

SpringMVC 中文官网:http://www.springmvc.cn/

ThreadLocal的使用场景:Web容器、Spring容器、日志打印的更多相关文章

  1. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  2. Web容器、Servlet容器、Spring容器、SpringMVC容器之间的关系

    以下内容为个人理解,如有误还请留言指出,不胜感激! Web容器 web容器(web服务器)主要有:Apache.IIS.Tomcat.Jetty.JBoss.webLogic等,而Tomcat.Jet ...

  3. web容器、sevlet容器、spring容器、springmvc容器之间的关系

    原文链接:http://www.cnblogs.com/jieerma666/p/10805966.html https://blog.csdn.net/zhanglf02/article/detai ...

  4. 简述Spring容器与SpringMVC的容器的联系与区别

    简述Spring容器与SpringMVC的容器的联系与区别 2017年07月04日 10:55:07 阅读数:6260 摘要: 在Spring整体框架的核心概念中,容器的核心思想是管理Bean的整个生 ...

  5. Spring容器与SpringMVC容器的区别与联系

    在spring整体框架的核心概念中,容器的核心思想是管理Bean的整个生命周期.但在一个项目中,Spring容器往往不止一个,最常见的场景就是在一个项目中引入Spring和SpringMVC这两个框架 ...

  6. spring4.1.8扩展实战之四:感知spring容器变化(SmartLifecycle接口)

    本章是<spring4.1.8扩展实战>的第四篇,如果业务上需要在spring容器启动和关闭的时候做一些操作,可以自定义SmartLifecycle接口的实现类来扩展,本章我们通过先分析再 ...

  7. Spring 读书笔记-----使用Spring容器(一)

    pring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spri ...

  8. (转)Spring 读书笔记-----使用Spring容器(一)

    Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spr ...

  9. Spring容器变化之SmartLifecycle,LifecycleProcesso接口详述

    Spring Boot run方法启动后相应的服务也随之启动,这个操作很妙.使用者都不用关心什么服务怎么启动,不管多少个服务怎么启动只要符合Spring Boot的启动规则都可以使用其run方法同一启 ...

  10. Spring框架:Spring容器具体解释

    Spring容器 Spring容器能够帮助你管理所有的Bean对象.专业术语称之为IoC控制反转.在传统的程序中.对象的生成都是由开发人员完毕的.而在控制反转中,对象的生成所有都交给框架完毕.这种优点 ...

随机推荐

  1. /etc/vsftpd/vsftpd.conf

    # Example config file /etc/vsftpd/vsftpd.conf## The default compiled in settings are fairly paranoid ...

  2. SpringCloud-分布式配置中心【加密-对称加密】

      前面我们介绍了SpringCloud的分布式配置中心,我们将项目中的配置信息保存在git或者码云的仓库中,但是这样一些敏感信息就暴露出来了,比如数据库连接的账号密码等信息,这时我们最好能够对这些信 ...

  3. 安装metasploitable3的经验总结

    一个月没有写学习记录了,但是这一个月一直没闲着,抽空写写自己装metasploitable3的经验教训(提示:只要你的环境配置没错,步骤没错,多试几次就会成功了,我总共测试了15次,,短的耗时30分钟 ...

  4. 修改系统的shell

    一:修改系统的shell     (选用zsh解释器,相对于bash,对它有很好的兼容性,而且功能上更加强大)    1.查看系统中安装的shell      cat  /etc/shells     ...

  5. 原生js封装轮播图

    个人实际开发中用到的效果问题总结出来便于自己以后开发查看调用,如果也适用其他人请随意拿走勿喷就行! 原生js对于思路要求比较高,在js代码我都写有备注,足够理解并使用,即使是小白或者刚入行的程序员也比 ...

  6. ABP开发框架前后端开发系列---(13)高级查询功能及界面的处理

    在一般的检索界面中,基于界面易用和美观方便的考虑,我们往往只提供一些常用的条件查询进行列表数据的查询,但是有时候一些业务表字段很多,一些不常见的条件可能在某些场景下也需要用到.因此我们在通用的查询条件 ...

  7. 长春理工大学第十四届程序设计竞赛(重现赛)I

    I.Fate Grand Order 题目链接:https://ac.nowcoder.com/acm/contest/912/I 题目: Fate Grand Order是型月社发行的角色扮演类手机 ...

  8. sort和sorted深入理解----引子:多维列表,如何实现第一个元素升序,第二个元素降序

    一.列表内建方法--sort() 作用:就地对列表排序(直接在原列表上做排序) 语法: list.sort(func=None, key=None, reverse=False) 当reverse=F ...

  9. C++ 洛谷 P1273 有线电视网 题解

     P1273 有线电视网  很明显,这是一道树形DP(图都画出来了,还不明显吗?) 未做完,持续更新中…… #include<cstdio> #include<cstring> ...

  10. cocopods新建或者更新远端库主要操作步骤

    1.搭建远程仓库(私有或者公有项目): 2.使用sourceTree拉去远程仓库: 3.打开拉去的项目仓库Finder,构建pod lib项目:pod lib create AFNetworking( ...