Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么@Transectional和@Async方法仍然出现超时错误?_Java_Spring Boot_Server - Fatal编程技术网

Java 为什么@Transectional和@Async方法仍然出现超时错误?

Java 为什么@Transectional和@Async方法仍然出现超时错误?,java,spring-boot,server,Java,Spring Boot,Server,为什么我仍然得到超时错误?有人能帮我弄清楚吗 应用程序入口点: API资源 API组件类: 服务等级 @服务 @事务(只读=真) 公共类编目服务{ @异步的 @事务性(只读=false,超时=1000) public void deleteCatalogItem(字符串catalogId、列表项idList、字符串communityId、字符串userId){ >//此处需要花费大量时间进行多个查询并获取异常 } } 我在执行时间CatalogService.deleteCatalogItem

为什么我仍然得到超时错误?有人能帮我弄清楚吗

应用程序入口点:

API资源

API组件类:

服务等级

@服务
@事务(只读=真)
公共类编目服务{
@异步的
@事务性(只读=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

    }
}