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
@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我对您的评论进行了投票,并错误地将其删除,我将让其他人再次投票。