Java 是否可以使用@Transactional测量所有Spring管理的事务的时间?

Java 是否可以使用@Transactional测量所有Spring管理的事务的时间?,java,spring,jpa,transactions,Java,Spring,Jpa,Transactions,我想用JpaTJpaTransactionManager/PlatformTransactionManager测量Spring管理的事务的时间,以检测长时间挂起的事务,并向某些侦听器警告该情况 我可以在@Transactional方法上使用aspect,但由于事务传播的原因,它不是检测确切事务何时启动或完成的好方法 P>对事务侦听器进行访问,如启动/结束事件的访问,以及启动TraseActs对象的bean名称,或者只是堆栈跟踪,您可以考虑实现一个类,该类实现了 Apple ListNeave,

我想用
JpaTJpaTransactionManager
/
PlatformTransactionManager
测量Spring管理的事务的时间,以检测长时间挂起的事务,并向某些侦听器警告该情况

我可以在
@Transactional
方法上使用aspect,但由于事务传播的原因,它不是检测确切事务何时启动或完成的好方法


<> P>对事务侦听器进行访问,如启动/结束事件的访问,以及启动TraseActs对象的bean名称,或者只是堆栈跟踪

,您可以考虑实现一个类,该类实现了<代码> Apple ListNeave<代码>,并在那里执行测量。大概是这样的:

@Component
public class TransactionListener implements ApplicationListener<Neo4jDataManipulationEvent> {

   private Long transactionStart;
   private static final Logger log = LoggerFactory.getLogger(TransactionListener.class);

    @Override
    public void onApplicationEvent(Neo4jDataManipulationEvent event) {
        if (event instanceof BeforeSaveEvent) {
            transactionStart = System.currentTimeMillis();
        }
        if (event instanceof AfterSaveEvent) {
            log.debug("Transaction time in ms: ", System.currentTimeMillis() - transactionStart);
            log.debug("Source: ", event.getSource());
        }
    }

之后,您需要使用
@EntityListeners(LogListener.class)
注释实体类,将哪些实例持久化到数据库中。

在注释方法中使用TransactionSynchronizationManager:

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){

       long startTime;

       void beforeCommit() {
           startTime = System.nanoTime();
       }
       void afterCommit(){
           System.out.println("Transaction time: " + (System.nanoTime() - startTime));
       }
});
使用aspect跟踪所有事务:

 @Aspect
 class TransactionAspect extends TransactionSynchronizationAdapter {

   @Before("@annotation(org.springframework.transaction.annotation.Transactional)")
   public void registerTransactionSyncrhonization() {
       TransactionSynchronizationManager.registerSynchronization(this);

   }

   ThreadLocal<Long> startTime = new ThreadLocal<>();

   void beforeCommit() {
       startTime.set(System.nanoTime());
   }
   void afterCommit(){
       System.out.println("Transaction time: " + (System.nanoTime() - startTime.get()));
   }
}
@方面
类TransactionSpect扩展TransactionSynchronizationAdapter{
@在(@annotation(org.springframework.transaction.annotation.Transactional)之前)
公共无效注册表TransactionSynchronization(){
TransactionSynchronizationManager.registerSynchronization(此);
}
ThreadLocal startTime=新的ThreadLocal();
提交前作废(){
startTime.set(System.nanoTime());
}
void afterCommit(){
System.out.println(“事务时间:+(System.nanoTime()-startTime.get());
}
}

JPA会发出这样的交易事件吗?@PiotrMüller我已经编辑了我的答案。让我知道这是否适合你。然而,idk如何以这种方式测量读取事务时间。UPVOUTS作为一些解决方案,但原始问题是关于事务机制,因此,它应该跨越事务时间,并处理诸如.createNativeQuery甚至JDBC之类的事务(如果仅由JPA transaction manager.Uvoted跨越),但我实际上指的是跟踪缓慢事务的一般事务测量,而不是显式跟踪每一个事务。已编辑的问题。@PiotrMüller使用方面。当前的建议是错误的,因为它在提交前使用
而不是在事务开始时进行测量。
TransactionSynchronizationAdapter
接口没有提供
beginTransaction
getTransaction
来介入。可以将开始时间测量移动到
寄存器TransactionSynchronization
中。但是,我们可以测量事务注释方法的整个运行时,而不是从事务的开始到结束。
 @Aspect
 class TransactionAspect extends TransactionSynchronizationAdapter {

   @Before("@annotation(org.springframework.transaction.annotation.Transactional)")
   public void registerTransactionSyncrhonization() {
       TransactionSynchronizationManager.registerSynchronization(this);

   }

   ThreadLocal<Long> startTime = new ThreadLocal<>();

   void beforeCommit() {
       startTime.set(System.nanoTime());
   }
   void afterCommit(){
       System.out.println("Transaction time: " + (System.nanoTime() - startTime.get()));
   }
}