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

标签 java spring transactions profiling aspectj

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

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

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

有没有办法在不重写 spring TransactionInterceptor 的情况下做到这一点?

最佳答案

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

假设您有一个命名切入点transactionalMethodExecution:

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

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

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

摘自cflowbelow的文档:

cflowbelow(Pointcut)

Picks out each join point in the control flow of any join point P picked out by Pointcut, but not P itself.

这个解决方案确实很简单,它不处理嵌套事务或任何更奇特的情况。对于这些情况,您需要更彻底的解决方案。

关于java - Spring Transaction - 记录新事务的方法执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45187302/

相关文章:

java - 检查列表中的某个对象是否属于此类

ruby-on-rails - 有没有办法将 after_commit 回调设置为特定的 ActiveRecord 事务

java - @Service、@Repository 类对静态字段的依赖注入(inject)有利于静态方法的使用吗?

spring - @Transactional与静态方法

java - Spring 事务中 REQUIRES_NEW 和 NESTED 传播行为的差异

java - 考虑在您的配置中定义 * 类型的 bean

java - kafka_2.11-0.8.2.1 消费者再平衡

java - Sun (1999) 的 "Code Conventions for the Java Programming Language"是否过时?

java - j_spring_security_check 404 问题

java - Spring 5 PathVariable 验证导致 Http 404