大佬请教一下,如题,我在service 层的方法中启用了定时刷新。项目用了spring AOP 做了个动态数据源的读写分离。对于selectXXX的service 层方法做了拦截让它去从库查询,但是定时刷新调用的selectXXX的servie方法却不走AOP, 直接用了默认的写库。如何在定时刷新的方法仍然走AOP
uqdfh47h1#
你们的读从库的标记是不是写在ThreadLocal上了,自动刷新在另外的线程池里面执行,这个标记肯定就读不到了。
gr8qqesn2#
是的,标记在threadlocal上了,但是这只是个线程安全的本地变量标识吧,其它线程读它aop生效也可以哇,如果我不用tjreadlocal了是否就可以
yi0zb3m43#
jetcache也是用spring aop实现的,你的切面如果在jetcache切面的外层肯定是不行的;如果在内层,有可能会可以,但我没试过。
EnableMethodCache可以设置order属性。
yqhsw0fo4#
多谢回答,优先级我看jetcahce 是最低的。切换数据源的优先级最高,事务切面其次,最后是jetcache 按理说是没有问题的。回头我调试一下再反馈
ljo96ir55#
调试了一下,跟优先级别还没有关系。就是感觉定时刷新的代理方法直接调用 service不会再被AOP 拦截。
ipakzgxi6#
补充一下,我如果把service 再包一层,是可以的。动态切换数据源会生效
xkftehaa7#
那么spring aop的invocation.proceed方法是有状态的,第二次调用和第一次调用是有差异的,之前忽略这个了,这还不太好解决呢
zxlwwiss8#
嗯,我觉得不要紧,可以通过 Package 方法来规避
8条答案
按热度按时间uqdfh47h1#
你们的读从库的标记是不是写在ThreadLocal上了,自动刷新在另外的线程池里面执行,这个标记肯定就读不到了。
gr8qqesn2#
是的,标记在threadlocal上了,但是这只是个线程安全的本地变量标识吧,其它线程读它aop生效也可以哇,如果我不用tjreadlocal了是否就可以
yi0zb3m43#
jetcache也是用spring aop实现的,你的切面如果在jetcache切面的外层肯定是不行的;如果在内层,有可能会可以,但我没试过。
EnableMethodCache可以设置order属性。
yqhsw0fo4#
多谢回答,优先级我看jetcahce 是最低的。切换数据源的优先级最高,事务切面其次,最后是jetcache 按理说是没有问题的。回头我调试一下再反馈
ljo96ir55#
调试了一下,跟优先级别还没有关系。就是感觉定时刷新的代理方法直接调用 service不会再被AOP 拦截。
ipakzgxi6#
补充一下,我如果把service 再包一层,是可以的。动态切换数据源会生效
xkftehaa7#
那么spring aop的invocation.proceed方法是有状态的,第二次调用和第一次调用是有差异的,之前忽略这个了,这还不太好解决呢
zxlwwiss8#
嗯,我觉得不要紧,可以通过 Package 方法来规避