Java后端web服务,对于某次前端请求,可能需要执行多个不同的业务方法才能处理完成。
这些不同的方法在做业务处理时可能需要多次操作某一数据,我们常规的做法是把该数据通过参数传递给方法,或者在方法需要该数据时从数据库获取。
前者迫使我们改变方法签名,后者加重数据库负担,因此都不是理想的做法。
实际上,我们可以在Controller或者Service类中定义一个ThreadLocal<T>变量,在首次拿到数据后,通过set方法将数据保存到变量中,在这之后被调用的方法中就可以用get方法得到这份数据。ThreadLocal<T>变量是线程内共享的,不同的线程之间不会相互影响,线程执行完以后数据会自动释放。
ps:
最近在一个springmvc项目中使用ThreadLocal时,遇到了数据错乱问题,偶现,大致情况如下。
我的代码执行顺序是先在A处set值,然后在B处get值,最后没有clear数据。
某次业务请求过来,执行到B处,get到了之前某次业务请求set进来的值,最终导致业务处理错乱。
具体原因还不确定,可能跟spring线程复用有关,难道线程复用导致ThreadLocal数据不能自动释放?
暂时在业务处理结束时加了clear处理,希望有老师给与指点,谢谢。