Java Spring Boot@Scheduled不适用于数据库事务
我有一个预定的工作,将删除数据库中的所有记录,并插入新的数据,每10分钟。如果我通过创建一个web服务来手动调用该服务,这将非常有效。但是,计划作业无法删除和插入。我使用JPA删除所有记录并保存。我也维护了@Transactional注释,但到目前为止运气不好。有什么想法吗Java Spring Boot@Scheduled不适用于数据库事务,java,spring-boot,Java,Spring Boot,我有一个预定的工作,将删除数据库中的所有记录,并插入新的数据,每10分钟。如果我通过创建一个web服务来手动调用该服务,这将非常有效。但是,计划作业无法删除和插入。我使用JPA删除所有记录并保存。我也维护了@Transactional注释,但到目前为止运气不好。有什么想法吗 @Service public class ScheduledService { @Autowired MainService mainService; @Scheduled(fixedDelay
@Service
public class ScheduledService {
@Autowired
MainService mainService;
@Scheduled(fixedDelay=100000, initialDelay=10000)
public void updateAllScreensScheduled() {
mainService.updateAllScreens();
}
}
My MainService.java
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateAllScreens() {
tSerScheduleJpaRepository.deleteAll(); // delete all schedule data
List<ScheduleData> scArr = getFreshData(); // get all schedule data
List<TSerScheduleEntity> list= new ArrayList<>();
for (ScheduleData scheduleData : scArr) {
TSerScheduleEntity entity = new TSerScheduleEntity();
entity.setRtNm(scheduleData.getRtNm());
list.add(entity);
}
tSerScheduleJpaRepository.save(list); // save schedule data
}
@Transactional(传播=传播。需要\u NEW)
public void updateAllScreens(){
tSerScheduleJpaRepository.deleteAll();//删除所有计划数据
List scArr=getFreshData();//获取所有计划数据
列表=新的ArrayList();
for(ScheduleData ScheduleData:scArr){
TSerScheduleEntity=新的TSerScheduleEntity();
entity.setRtNm(scheduleData.getRtNm());
列表。添加(实体);
}
tSerScheduleJpaRepository.save(list);//保存计划数据
}
最后,我通过以下方式解决了这个问题:
@EnableTransactionManagement
,还添加了
PlatformTransactionManager
Bean。检查以下代码:import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
希望这能解决您的问题:)我通过使用主体
mainService.updateAllScreens()创建一个带有@Async
注释的方法,解决了这个问题从updateAllScreens()
因此,updateAllScreensScheduled()
看起来就像是对异步方法的调用
注意:别忘了将@enablesync
添加到配置中您会遇到什么错误?没有错误,一切看起来都很好..但是数据没有保存在数据库中。是否调用了方法updateAllScreensScheduled()
?您是否在某处启用了@EnableScheduling
?是的,在调试模式下进行了测试,所有操作都已执行。我在spring boot主类中保留了@EnableScheduling。您是否尝试过不使用propagation=propagation。在@事务中需要\u NEW
?这没有帮助
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Scheduled(fixedRate = 60 *10*1000)
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void reportCurrentTime() {
doDatabaseTransaction();
}
Here is the imports :
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;