Java 为什么@Transectional和@Async方法仍然出现超时错误?
为什么我仍然得到超时错误?有人能帮我弄清楚吗 应用程序入口点: API资源 API组件类: 服务等级Java 为什么@Transectional和@Async方法仍然出现超时错误?,java,spring-boot,server,Java,Spring Boot,Server,为什么我仍然得到超时错误?有人能帮我弄清楚吗 应用程序入口点: API资源 API组件类: 服务等级 @服务 @事务(只读=真) 公共类编目服务{ @异步的 @事务性(只读=false,超时=1000) public void deleteCatalogItem(字符串catalogId、列表项idList、字符串communityId、字符串userId){ >//此处需要花费大量时间进行多个查询并获取异常 } } 我在执行时间CatalogService.deleteCatalogItem
@服务
@事务(只读=真)
公共类编目服务{
@异步的
@事务性(只读=false,超时=1000)
public void deleteCatalogItem(字符串catalogId、列表项idList、字符串communityId、字符串userId){
>//此处需要花费大量时间进行多个查询并获取异常
}
}
我在执行时间CatalogService.deleteCatalogItem期间遇到超时异常。有谁能帮忙解决这个问题吗
异常的日志为:
查询数据库时出错。原因:org.postgresql.util.psql异常:
错误:由于用户请求而取消语句
从未尝试过这一点,但如果您将@Transaction放在任何方法上,spring会在该方法上添加通知,并为该方法创建代理。在代理内部,它在代理中的方法周围添加BeginTransaction/commit transaction。现在,由于您的实际方法是异步同时运行的,我假设handle没有到达提交事务部分。我不太熟悉Spring Boot,但假设它像JavaEE一样工作,那么该方法将异步运行,但也将通过某种拦截器/aroundinvoke特性包装在事务中。这意味着事务处理也将是异步调用的一部分,如果该调用花费的时间太长,您仍然会得到一个超时。要解决这个问题,您必须增加超时时间,提高代码/查询的性能,或者将进程分成更小、更易于管理的部分。@Transactional(readOnly=false,timeout=1000),超时设置对于我的情况已经足够了。任何其他建议。添加@Async
不会减少执行复杂删除查询所需的时间。要么修复/加速查询(看看哪里可以改进它们),要么增加超时。超时=1000,就足够了,大约20秒后就会出错。
@SpringBootApplication
@EnableAsync
public class MyWebapiApplication {
public static void main(String[] args) {
SpringApplication.run(MyWebapiApplication.class, args);
}
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("GithubLookup-");
executor.initialize();
return executor;
}
}
public interface CatalogResource {
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("{id}/items")
public Response deleteCatalogItem(@PathParam("id") String catalogId,@QueryParam("community") String communityId,CatalogItemFilter catalogItemFilter);
}
@Component
public class CatalogComponent implements CatalogResource {
@Override
public Response deleteCatalogItem( String catalogId, String communityId, CatalogItemFilter catalogItemFilter ){
catalogService.deleteCatalogItem( catalogId, catalogItemFilter.getItemIdList(), communityId, userId );
return Response.status(200).build();
}
}
@Service
@Transactional(readOnly=true)
public class CatalogService {
@Async
@Transactional(readOnly=false, timeout = 1000)
public void deleteCatalogItem( String catalogId, List<String> itemIdList, String communityId, String userId ){
> // Here time consuming multiple queries and getting exception
}
}