由于项目需求变动,需要在接口里添加一个参数
比如原来method(String param1) 现在要变成method(String param1,String param2)
一般做法就是把原来的接口的方法全换掉,或者重载再写一个多一个参数的方法。
参数由controller 一直到service,由于改动比较多,就想到用ThreadLocal。
后来发现有一个没有参数的请求,也做了处理参数的操作,但是又不是每次都出现,
多请求几次就会出现一两次,感觉很奇怪:
url1:http://127.0.0.1/controller1?param=1
url2:http://127.0.0.1/controller2
controller1把request的参数放到threadLocal里,调用service,可以拿到param的值。
可是controller2有时也可以拿到param的值。
一点点排除发现不管是tomcat还是resin容器,都是线程池管理的,
比如controller1请求使用的thread1线程,在thread1放param的值,当请求完了后,thread1并没有销毁,
多次请求contoller2,controller2的线程可能会是thread1,这时还是有param的值的。所以也出现没有参数
的请求也在service处理了param。
找到问题后就修复:
有的人会建议在controller2中也加一个threadLocal.set(param) [param的值为null]不就行了。这个方法本人感觉不好,可以使用spring的@Scope(value="request"),这个注解是对每一次request请求时
的参数做一个全局参数。
相关推荐
在传统的多线程Web应用中,由于多个线程可能会处理同一个请求,如果直接在全局变量中存储session信息,可能会导致线程安全问题。而ThreadLocal提供了一个线程局部的存储空间,每个线程都有自己的ThreadLocal变量...
- 尽量避免将ThreadLocal用作长期持有的全局变量,尤其是在静态方法或静态变量中使用。 - 避免过度依赖ThreadLocal,因为它可能导致设计上的复杂性和难以维护的问题。 综上所述,ThreadLocal是Java多线程编程中的一...
- 请求上下文:在Web应用中,可以使用ThreadLocal存储HttpServletRequest、Session等与请求相关的数据,确保这些数据只在当前请求的线程内可见。 - 数据库连接:在数据库连接池中,可以使用ThreadLocal为每个线程...
在这个场景中,不能使用ThreadLocal类,因为ThreadLocal适用的场景是,多个线程都需要使用一个变量,但这个变量的值不需要在各个线程间共享,各个线程都只使用自己的这个变量的值。 ThreadLocal还能解决一个参数...
此外,ThreadLocal还有其他应用场景,比如在Web开发中,可以用来存储请求相关的上下文信息,如用户会话、线程安全的计数器等,避免在多线程环境中的数据污染问题。 总之,ThreadLocal是Java多线程编程中的一种有效...
3. **避免全局变量**:在多线程环境中,全局变量可能导致数据竞争和同步问题,ThreadLocal可以作为局部化的全局变量,为每个线程提供独立的副本。 使用ThreadLocal的基本操作包括: - **创建ThreadLocal对象**:`...
这与传统的全局变量不同,全局变量在所有线程间共享,可能导致数据冲突。 **ThreadLocal的作用和目的:** 1. **数据隔离**:ThreadLocal确保了每个线程都有自己的变量副本,避免了多线程之间的数据竞争,从而提高...
在Web应用中,Cookie经常与Session一起使用,通过在客户端存储Session标识符来简化会话管理。 ### 确保线程安全 #### 七、线程安全 在Servlet环境中,确保线程安全是非常重要的,因为多个请求可能会并发访问相同的...
- 为了防止这种情况,应该在不使用 ThreadLocal 时显式调用 `remove()`,或者在适当的时机(如应用关闭时)进行全局清理。 5. **线程池中的注意事项**: - 如果使用线程池,线程可能会复用。当一个线程完成任务后...
ThreadLocal是Java中的一个类,用于在每个线程中存储独立的变量副本。在这里,`ConnectionContext`类使用ThreadLocal来为每个线程维护一个数据库连接。这样,每个线程在执行过程中都可以访问自己独有的连接,避免了...
5. **解决策略**:实现线程安全的方法包括但不限于使用线程局部变量(ThreadLocal)、synchronized关键字、ReentrantLock等同步机制,以及避免在Servlet或Action中使用实例变量,转而使用局部变量或依赖注入等策略。...
进一步跟踪调用链,发现在AbstractProtocol的内部类ConnectionHandler中,处理器(Processor)的信息被存储在了一个全局变量global中,该变量包含了RequestGroupInfo类型的列表,每个RequestGroupInfo包含了Request...
分页技术是Web应用中非常常见的一种数据展示方式,它能有效地管理大量数据,避免一次性加载所有数据导致的性能问题。以下将详细解释如何实现分页技术,主要涉及`Pager-taglib 2.0`标签库的使用、分页参数的传递以及...
* 局部变量和全局变量 * 字符串及其操作 * 函数高级关键字参数 * 函数的返回值 * 位置参数 * 可变参数 * lambda 表达式 * 递归函数 * 参数引用 * 常用内置函数 * 类和对象面向对象思想 * 接收啊、类的定义、对象的...
但要特别注意,避免在Servlet中使用全局变量存储数据,因为这可能导致数据竞争和不一致性。 3. **Java多态** 多态是面向对象编程的一个关键特性,它允许使用父类型的引用操作子类型对象。在Java中,多态有两种主要...
例如,如果多个线程同时访问和修改同一个全局变量,数据的完整性可能会受损。为了避免这种情况,可以使用同步机制,如`synchronized`关键字或Java并发工具类。 2. **线程局部存储**:Servlet容器可以使用线程局部...
在业务代码中,通过`@Transactional`注解开启分布式事务,并在必要时使用`ThreadLocal`存储当前业务的数据源标识。 8. **监控与调试** Druid提供了一个Web监控界面,可以实时查看数据源的使用情况、SQL执行效率等...
在SpringMVC中,注解主要用于声明式的配置,使得开发人员可以在不使用XML配置的情况下实现控制器、请求映射等功能。 ##### 2.4 SpringMVC常用的注解有哪些及作用? - **@Controller**:标记一个类作为SpringMVC的...
在多线程环境中,如Web应用或EJB容器,为了保证`Session`的线程安全和资源的有效利用,可以使用`ThreadLocal`变量来存储当前线程的`Session`实例。然而,在CMT环境中,由于单个session bean可能会被多个线程并行调用...