有没有更好的实现方案

先说下场景,A方法里面会调用B方法,B方法里面会调用C方法,每个方法里面会产生多个临时变量,想通过一条sql记录起来,这条sql包含本次外部调用,A以及B和C产生的临时变量,注意是一条sql。本来是想通过日志去记录,但是每次排查问题都要去看各个方法产生的日志,而且有时候还要追溯很久之前的,日志还会被清理,很不方便,所以想存到数据库里面。也想过另一种实现方式,就是在A里面定义一个object然后把A产生的临时变量塞进去,在调用B方法时,把这个object通过参数传给B,在B方法里面把临时变量存到object,包括C也是,但是要改B和C方法的定义,不想这样改调用的地方太多了。还有一种通过Threadlocal来记录这个object,这样本次线程执行各个方法拿到的都是同一个object,但是当下这个Threadlocal已经被用了,里面存的是个Long类型,没办法拓展,所以想问下有没有更好的实现方案?

Threadlocal不是只能有一个的,可以在加一个Threadlocal

在加个 Threadlocal啊,那玩意儿又不是只能有一个,各种框架里面都不知道自带了多少个了

可以使用redis实现,先将a的变量写进去,调用B方法时,先取出redis中的变量,然后将b的变量追加进去重新赋值,以此类推

Threadlocal这个可以定义多个,Threadlocal1,Threadlocal2,Threadlocal3,Threadlocal4,,,他们都存在当前线程对应的ThreadlocalMap中,直接声明多个没有问题的

目前代码实现的方案是,在A方法定义为AOP的拦截方法,在环绕通知里面往threadlocal里面设置一个DTO然后,在执行目标方法A,A里面依次往threadlocal的DTO set各个字段,包括B方法和C方法都会通过threadlocal设置产生的临时变量,目标A方法执行完了之后,回到环绕通知方法里面,此时DTO里面已经存了A、B、C、的临时变量,然后保存到数据库,最后在finally执行置空threadlocal里面的对象。最后有个不好的点就是代码侵入性太强了,需要在方法里面设置临时变量到DTO里面,如果可以通过像log.info这种方式把数据记录到数据库,并且多个方法的临时变量,通过traceId维护到一条记录里面就好了

Threadlocal可以做到
你可以再新增一个Threadlocal变量实现你的需求

sql语句做成全局变量就行了