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

通过JMS MessageListener调用JPA事务时提交失败

潘飞英
2023-03-14

我有一个代码可以很好地工作,但当负载很高时失败。无法找到原因的路线。下面是我的用例概述

  1. 我正在从JMS队列中读取消息
  2. 使用接收到的消息调用一个REST APIendpoint
  3. 在我的数据库中保存从#2收到的响应

下面是代码片段

 //Message Listener class which reads the messages from JMS Queue
 public class MyListener implements MessageListener {
        @Autowired
        MyDao myDao;

        @Override
        public void onMessage(Message message) {
             MyResponse resp = callRest(message);
             myDao.saveToDb(resp);
       }
    }

    //DAO class which updates my entity   
    @Component
    public class MyDao {
          @Autowired
          EntityManager entityManager;

          @Transactional
           public boolean saveToDb(MyResponse resp) {
             Query query = entityManager.createQuery("from MyTable mt where mt.id=:id");
             query.setParameter("id", myResp.getId());
             MyTable myTab = (MyTable) query.getSingleResult();
             myTab.setProcessFlag(true);
             entityManager.merge(myTab);
          }
     }

当我在调试模式下运行时,或者当消息不太频繁地进入队列时,这种方法很好。

但是当队列中的消息非常快时,我在saveToDb方法中得到异常

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

当多个线程同时访问JMS和JPA事务时,我是不是做错了什么,或者JMS和JPA事务之间是否有一些混淆?

提前致谢。

共有1个答案

江浩慨
2023-03-14

当您调用也标记为@Transactional的嵌套方法/服务时,会发生此异常。

了解更多详情

 类似资料:
  • 问题内容: 我在正在使用的一个应用程序中使用Spring和Hibernate,但是在处理事务时遇到了问题。 我有一个服务类,该类从数据库中加载一些实体,修改它们的一些值,然后(当所有内容都有效时)将这些更改提交给数据库。如果新值无效(我只能在设置它们后检查),但我不想保留更改。为了防止Spring / Hibernate保存更改,我在方法中抛出异常。但是,这导致以下错误: 这是服务: 这就是我调用

  • 我在一个应用程序中使用Spring和Hibernate,我在处理事务时遇到了问题。 我有一个服务类,它从数据库加载一些实体,修改它们的一些值,然后(当一切都有效时)将这些更改提交给数据库。如果新值无效(我只能在设置它们后检查),我不想保留更改。为了防止Spring/Hibernate保存更改,我在方法中抛出一个异常。但是,这会导致以下错误: 这就是服务: 我就是这样调用它的: 我希望发生的事情是:

  • 我正在使用手动事务时插入/更新3个表。我想在事务提交后立即插入到历史表中。这意味着有3个操作(针对每个表),只有在提交这些操作之后,我才希望调用一个方法。 这是我的代码: 有什么post commit方法吗?如何在提交之后而不是持久之后调用方法?

  • 我在使用Hibernate执行数据库更新时遇到了一个问题。当尝试repository.add(Object)操作时,它会给出一个验证异常。 我已经在模型类上添加了验证,但是我试图插入的值似乎满足了要求,所以我不知道问题出在哪里。 如果删除验证注释,repository.add(object)就可以成功完成,即。 好心看看有没有什么建议,提前谢谢。 MySQL(8.0.17)模式 Hibernate

  • 问题内容: 我在控制器中有这个: 我想从: 如何通过使用Ajax调用来提交此信息我需要让此表单提交的JQuery ajax调用。 而且我想确保数据类型,谢谢 问题答案: 试试这个

  • 您能否帮助解决Resin+Oracle上XA事务的问题: 我们有WebApp,它必须执行涉及Oracle11.2.0.1和EHCache2.7的业务事务。(实际上可能有各种组合--两个不同的Oracle数据源(不同的模式),带有/不带有Ehcache,等等)。这就是从普通JDBC使用切换到JTA事务划分的原因。 > 在外部事务中使用Ehcache访问,在内部事务中只使用DB访问,即使在内部事务中使