Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Spring Boot JPA和HikariCP保持活动连接_Spring_Spring Boot_Spring Data Jpa_Hikaricp - Fatal编程技术网

Spring Boot JPA和HikariCP保持活动连接

Spring Boot JPA和HikariCP保持活动连接,spring,spring-boot,spring-data-jpa,hikaricp,Spring,Spring Boot,Spring Data Jpa,Hikaricp,简介: 有没有办法确保数据库连接返回到池中 不简短: 数据流: 我有一些长时间运行的任务,可以以大容量突发方式发送到服务器 每个请求都记录在开始提交的数据库中。然后发送该请求进行处理 如果失败或成功,则在任务完成后记录请求 问题在于,在整个长时间运行的任务中记录提交之后,连接池使用“活动”连接。如果爆发足够大,这可能会耗尽我拥有的任何大小的池 我使用的spring boot具有以下结构: 控制器-响应“/”并自动连接“服务” 服务-包含与数据库交互的所有JPA存储库和@Transactional

简介

有没有办法确保数据库连接返回到池中

不简短:

数据流:

  • 我有一些长时间运行的任务,可以以大容量突发方式发送到服务器
  • 每个请求都记录在开始提交的数据库中。然后发送该请求进行处理
  • 如果失败或成功,则在任务完成后记录请求
  • 问题在于,在整个长时间运行的任务中记录提交之后,连接池使用“活动”连接。如果爆发足够大,这可能会耗尽我拥有的任何大小的池

    我使用的spring boot具有以下结构:

  • 控制器-响应“/”并自动连接“服务”
  • 服务-包含与数据库交互的所有JPA存储库和@Transactional方法
  • 每次从控制器调用第一个服务方法时,它都会打开一个活动连接,直到控制器方法返回才释放它

    那么,有没有办法在每个服务方法之后返回到池的连接

    以下是服务类别总计:

    @Service
    @Slf4j
    class SubmissionService {
    
    @Autowired
    CompanyRepository companyRepository;
    
    @Autowired
    SubmissionRepository submissionRepository;
    
    @Autowired
    FailureRepository failureRepository;
    
    @Autowired
    DataSource dataSource
    
    @Transactional(readOnly = true)
    public Long getCompany(String apiToken){
        if(!apiToken){
            return null
        }
        return companyRepository.findByApiToken(apiToken)?.id
    }
    
    @Transactional
    public void successSubmission(Long id) {
        log.debug("updating submission ${id} to success")
        def submissionInstance = submissionRepository.findOne(id)
        submissionInstance.message = "successfully analyzed."
        submissionInstance.success = true
        submissionRepository.save(submissionInstance)
    }
    
    @Transactional
    public long createSubmission(Map properties) {
        log.debug("creating submission ${properties}")
        dataSource.pool.logPoolState()
        def submissionInstance = new Submission()
        for (key in properties.keySet()) {
            if(submissionInstance.hasProperty(key)){
                submissionInstance."${key}" = properties.get(key)
            }
        }
        submissionInstance.company = companyRepository.findOne(properties.companyId)
        submissionRepository.save(submissionInstance)
        return submissionInstance.id
    }
    
    @Transactional
    public Long failureSubmission(Exception e, Object analysis, Long submissionId){
        //Track the failures
        log.debug("updating submission ${submissionId} to failure")
        def submissionInstance
        if (submissionId) {
            submissionInstance = submissionRepository.findOne(submissionId)
            submissionRepository.save(submissionInstance)
        }
    
        def failureInstance = new Failure(submission: submissionInstance, submittedJson: JsonOutput.toJson(analysis), errorMessage: e.message)
    
        failureRepository.save(failureInstance)
    
        return failureInstance.id
      }
    }
    

    结果是@M.Deinum走上了正确的轨道。如果应用程序属性
    Spring.JPA.open\u in_view
    设置为true,则Spring Boot JPA会自动打开“OpenEntityManagerViewFilter”,默认设置为true。我在抽屉里找到了这个


    将此设置为false后,数据库会话没有保留,我的问题就消失了。

    为什么您认为会为控制器方法调用检索连接,并且只在控制器方法返回时才返回池?当事务结束时,连接将返回到池。这取决于是否有
    OpenEntityManagerViewFilter
    (或拦截器)会话和连接被打开并为传入请求维护。@jbnize从我的调试中删除,该调试在释放请求时看起来是正确的。我能够记录池的活动连接,并且在事务方法之后连接不会返回。@M.Deinum我对您的评论进行了投票,并错误地将其删除,我将让其他人再次投票。