Spring Transaction - 记录新事务的方法执行时间

Posted

技术标签:

【中文标题】Spring Transaction - 记录新事务的方法执行时间【英文标题】:Spring Transaction - Log method execution time on new transaction 【发布时间】:2017-07-19 10:04:52 【问题描述】:

我有一个 aspect-j 方面(在编译时编织)来记录方法名称和执行时间,当最后一个大于 1 秒时。

日志被聚合在一个 ELK 堆栈中,我们想要进行分析可视化,问题是堆栈中的所有子调用也被跟踪,并且我们有多个跟踪,每个工作单元都有多个方法名称。

我只想跟踪每个工作单元的入口点方法,即。每个方法都会触发一个新事务(而不是加入现有事务的那个)。

有没有办法在不覆盖 spring TransactionInterceptor 的情况下这样做?

【问题讨论】:

【参考方案1】:

如果您需要一个仅使用 AspectJ 的简单解决方案,以下可能对您有用。

假设你有一个命名的切入点transactionalMethodExecution

pointcut transactionalMethodExecution(): execution(@org.springframework.transaction.annotation.Transactional * *(..));;

您可以使用cflowbelow 排除最顶层控制流中所有嵌套的transactionalMethodExecution 切入点:

transactionalMethodExecution() && !cflowbelow(transactionalMethodExecution())

来自cflowbelow上的文档:

cflowbelow(Pointcut)

Pointcut 选择的任何连接点P 的控制流中选择每个连接点,但不是P 本身。

这个解决方案无疑是简单的,它不处理嵌套事务或任何更花哨的情况。对于这些情况,您需要更彻底的解决方案。

【讨论】:

我没有嵌套事务(JTA),这似乎正是我正在寻找的;简单优雅!如果您不介意,我稍后会测试并接受:)

以上是关于Spring Transaction - 记录新事务的方法执行时间的主要内容,如果未能解决你的问题,请参考以下文章

商院新事 | 交大安泰DBA校友分享“物联网商业模式探索”

Spring Transaction:如果我不在方法上给出@Transaction 注释会发生啥

Spring在一个事务中开启另一个事务

Spring 事务Transaction源码深度解析

spring---transaction---事务的配置

spring transaction注解原理