当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA和HikariCP维护活动连接

陈刚洁
2023-03-14

简介:

    null

问题是,在提交通过长时间运行的任务全程记录后,连接池使用“活动”连接。如果突发足够大,这可能会耗尽我拥有的任何大小的池。

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

  1. 控制器-在“/”处响应,并使“服务”autowired。
  2. 服务-包含与数据库交互的所有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
  }
}

共有1个答案

段干开宇
2023-03-14

事实证明@M.Deinum走上了正确的轨道。如果应用程序属性Spring.JPA.open_in_view设置为true,则Spring Boot JPA自动打开“OpenEntityManagerInViewFilter”(默认情况下为true)。我在JPA配置源中找到了这个。

将此设置为false后,数据库会话就不会继续了,我的问题也就消失了。

 类似资料:
  • 此刻我被困住的一点是调试处于“活动”状态的连接,以及它们正在做什么或它们当前被困的原因。 当我运行“10个同时用户”时,它基本上可以转换成2或3倍于此的查询,因此,当我打开HikariCP调试日志时,它会挂在类似的位置-上,而“active”连接并没有真正释放连接,这正是我试图找出的原因,因为查询相当简单,表本身只有4个字段(包括主键)。 HikariCP人员的最佳实践通常也是,增加连接池不是实现

  • 当Java服务(HikariCP JDBC Oracle,pool=10)有包括数据库操作和外部服务调用在内的大事务时,我遇到了这个问题,在运行此事务期间,Hikari保留连接(至少通过JMX显示它),直到事务完成。由于服务调用(无法将其从事务中排除,我已经最小化了超时),因此由于服务调用而导致操作很长,因此活动连接保留的时间太长,它会阻止所有服务。 线程在getConnection()上被阻止。

  • 我有两种不同的活动。主要活动,联系人列表 在联系人详细信息 Intent Intent=新的Intent(getBaseContext(),MainActivity)。类);意图putExtra(“联系人编号”,联系人编号);星触觉(意图) 在MainActivity OnResume方法中 字符串数据=getIntent()。getExtras()。getString(“keyName”); a

  • > 可能是我有这个确切的问题https://github.com/brettwooldridge/hikaricp/issues/109在我的例子中,活动连接随着每个事务的增加而增加。 HikariCP-连接不可用这也是一个相同的问题。但没有人对此提供明确的解决方案。顺便说一句,我使用了begging中的。

  • 我正在Wordpress中实现一个主题。此主题有一个顶部导航菜单,每个父项下都有水平子菜单。它将“活动”类放在当前已查看的父项上(否则不会显示其子菜单项)。通过在函数中使用这两个函数,我设法在当前父项上维护“活动”类。php。 但是现在我的问题是,当我点击任何父菜单项的子菜单或子菜单项时,它成功地将我带到子页面,但从父菜单中删除“活动”类,并将其放在子菜单项上(因为它是当前查看的页面)。我不希望它

  • 我是Android编程新手。 我想了解如何为特定的Android应用程序维护活动堆栈,以及它如何根据用户导航进行更改。 例如,如果有多个活动,那么当用户单击“后退”按钮或“主页”按钮或启动新活动时,活动堆栈的行为如何? 我试图找到一个合适的职位,我可以得到所有的信息,但我没有得到任何。有人能建议我一些链接/帖子,我可以学习这个吗? 编辑: 到目前为止我遇到的链接/帖子: > onSaveInsta