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()));
}
}