atr*_*ain 6 spring multithreading asynchronous hibernate jdbc
我一直在使用AbstractRoutingDataSource取得了巨大成功,但遇到了一个我无法解决的问题:当我开始使用异步方法时@Async
,它会丢失本地线程的上下文,我无法弄清楚要设置的位置数据库上下文切换.通常我会在一个方面或在一个方面HandlerInterceptor
,但@Async
不会通过任何这些通常的路线.是否有拦截器或类似的东西,我可以配置为在异步调用的开始和结束时触发,以便我可以设置数据库上下文?
在Spring留言板上找到了类似的问题.但是没有答案:http://forum.springsource.org/showthread.php?83792-Async-annotated-method-hanging-on-session-scoped-bean
编辑:我已经调试了执行流程,并且AbstractRoutingData源实际上是在异步线程中调用的,但是在调用方面之前调用它,所以在值设置之前DataSource
已经在Hibernate会话中设置了.查看源代码,后面的,因为拦截器返回其值,因此它在其他任何东西之前被触发.ThreadLocal
AsyncExecutionInterceptor
@Async
Order
HIGHEST_PRECEDENCE
我想我已经找到了答案:方法执行拦截将无法设置 上的变量ThreadLocal
,因为AsyncExecutionInterceptor
始终具有更高的优先级并启动 Hibernate 事务。相反,我所做的是将逻辑从异步方法外部化到其自己的类,并通过 将该方法标记为需要其自己的事务@Transactional(propagation=Propagation.REQUIRES_NEW)
。由于子方法现在在其自己的事务中运行,因此新 Hibernate 事务开始时ThreadLocal
会正确拾取 上的变量。AbstractRoutingDataSource
归档时间: |
|
查看次数: |
2527 次 |
最近记录: |