是否可以使用@Transactional测量所有Spring托管交易的时间?

Pio*_*ler 1 java spring jpa transactions

我想测量一下Spring管理的交易时间,用JpaTJpaTransactionManager/ PlatformTransactionManager检测长挂起的交易,并警告一些听众关于这种情况.

我可以在@Transactional方法上使用方面但由于事务传播,它不是检测确切事务何时开始或完成的好方法.

像事务监听器这样的东西可以访问启动/完成事件以及启动trasaction的对象的bean名称或只是堆栈跟踪

Sla*_*tal 5

在带注释的方法中使用TransactionSynchronizationManager:

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){

       long startTime;

       void beforeCommit() {
           startTime = System.nanoTime();
       }
       void afterCommit(){
           System.out.println("Transaction time: " + (System.nanoTime() - startTime));
       }
});
Run Code Online (Sandbox Code Playgroud)

跟踪方面的所有交易:

 @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()));
   }
}
Run Code Online (Sandbox Code Playgroud)

  • “TransactionSynchronizationAdapter”接口不提供“beginTransaction”或“getTransaction”来介入。可以将开始时间测量移到“registerTransactionSynchronization”内。但随后我们将测量事务性注释方法的整个运行时间,而不是事务的开始到结束。 (2认同)